MySQL事务问题验证

我们使用项目中一个余额表来验证:

查询事务隔离级别

执行下面SQL(MySQL8.0以下版本transaction_isolation为tx_isolation)查询隔离级别为可重复读:

goland开启事务单步模式

脏读

脏写

事务B

读倾斜

事务B:

一致性快照事务的可见性规则

  • 每笔事务开始时,数据库列出其他正在进行的事务,然后忽略这些事务完成的部分写入,即不可见。

  • 所有中止事务所做的修改全部不可见。

  • 较晚事务ID(晚于当前事务ID)所做的所有修改不可见,不管这些事务是否完成了提交。

  • 除上面三条外,其他所有的写入都对应用查询可见。

上面读倾斜的例子已经验证了上面三条描述。注意,一致性快照可见性原则适用于读取数据,如果对数据对象做修改,那么将是另一种情况了。

更新丢失

事务B

原子写操作

原子写操作是指直接用SQL更新数据,而不需要读出数据后手动计算,可以解决递增计数器等问题 比如更新丢失例子里的version没有丢失更新,就是因为用了原子写操作。

原子比较和设置

事务B:

显示加锁

事务B:

写倾斜和幻读

事务B:

最后更新于