并发事务带来的问题
A和B是并发事务
脏写(A被B覆盖)
两个事务。
B事务覆盖了A事务。
解决:应该事务并行
脏读(B读到了A的执行中间结果)
A修改了东西。
B看到了他的中间状态。
解决:读写冲突。加锁,改完再读。 共享锁。
不可重复读
A事务,能看到1,2,3条数据。
B事务对这1数据,进行修改/删除。
A又看了一遍,只剩下了2,3。1被删除了。
这就是,不可重复读
不可重复读:针对不同事务中。针对A同一个查询条件下,B修改了这些数据,会造成不可重复读。
重点是,删除和修改。
为什么是删除和修改。就1,2,3,能看到这些。
就可以加行锁。 独占锁。
就可以处理不可重复读,但是不能处理幻读。
幻读
A事务,能看到1,2,3条数据。
那么锁这1,2,3数据,这三个数据不能动。
B事务不能修改/删除,1,2,3。
他去新增了4这条数据,也是满足A查询条件的。
A就去查了一下,发现变成了4条数据。
这就是幻读。
解决方法,行锁已经失效。可以表锁。
还有乐观锁,
MVVC(多版本并发控制)避免不可重复读和幻读。
读未提交【read uncommitted】【会产生 脏读,不可重复读,幻读】
读已提交【read committed】【会产生 不可重复读,幻读】
可重复读【repeatable read】【会产生 幻读】
序列化【serializable】:最高的隔离级别,完全服从ACID的隔离级别,依次按照事务的顺序进行执行