MySQL事务问题验证
我们使用项目中一个余额表来验证:
查询事务隔离级别
执行下面SQL(MySQL8.0以下版本transaction_isolation为tx_isolation)查询隔离级别为可重复读:
goland开启事务单步模式
脏读
脏写
事务B
读倾斜
事务B:
一致性快照事务的可见性规则
每笔事务开始时,数据库列出其他正在进行的事务,然后忽略这些事务完成的部分写入,即不可见。
所有中止事务所做的修改全部不可见。
较晚事务ID(晚于当前事务ID)所做的所有修改不可见,不管这些事务是否完成了提交。
除上面三条外,其他所有的写入都对应用查询可见。
上面读倾斜的例子已经验证了上面三条描述。注意,一致性快照可见性原则适用于读取数据,如果对数据对象做修改,那么将是另一种情况了。
更新丢失
事务B
原子写操作
原子写操作是指直接用SQL更新数据,而不需要读出数据后手动计算,可以解决递增计数器等问题 比如更新丢失例子里的version没有丢失更新,就是因为用了原子写操作。
原子比较和设置
事务B:
显示加锁
事务B:
写倾斜和幻读
事务B:
最后更新于