DDIA 随笔

弱隔离性(不同隔离级别)

 读已提交  -- 解决脏读和脏写

    脏写很容易,加行锁

    脏读的话记录事务更新前的值和更新后后的值,不立即覆盖,读取时候获取更新前的值,也方便回滚

快照隔离和可重复读

  不可重复读(转账时事务没来得及提交,导致连续两次读结果不一样)

  解决方法快照隔离(读不阻塞写,写不阻塞读)+MVCC多版本并发控制。对于一个对象,多个不同时间点的快照,即多版本并发控制

丢失更新(两个事务同时读,然后修改写回,没有包含对方更新,导致丢失更新)

  把读取-修改-写入序列这一操作过程改为原子操作+锁,这种方法改为串行化执行

  CAS(compare and set),利用快照隔离实现,如果当前事务,写回时检查原来修改值和读取时候的值是否一致,不一致就重新读取-修改-写入序列

写入偏差和幻读(写入偏差,两个事务修改不同的对象,但是对于两个对象的和有限制,导致两个对象和不满足约束,其他例子,抢注用户名,双重开支,多人游戏移动到同一位置)

  幻读(一个事务中的写入改变另一个事务的搜索查询的结果,被称为 幻读)解决方法---物化冲突,给特定时间段加行锁。

可串行化(最强的隔离级别)

  实现方法

    1 字面意思串行化执行(单线程循环执行事务)

    2 两阶段锁定 2PL(读阻塞写,写阻塞读)锁分为共享模式,和独占模式。第一阶段,获取锁,第二阶段释放所有锁。可能出现问题,死锁,性能不佳,为了提高性能使用谓词锁或者是索引范围锁

    3 乐观并发控制技术  可串行化快照隔离

 

对于分布式问题

  分布式快照隔离需要比对事务号,事务号大的写入对于事务号小的快照是不可见的,那么对于不同节点的写入,事务号如何同步,spanner采用同步时钟的时间戳作为作为事务ID,他有一个置信区间,可以更加精确的表示先后关系。

posted @ 2023-02-28 17:57  tuffy_tc  阅读(20)  评论(0)    收藏  举报