- 数据库事物并发带来的问题
(1)脏写、丢失更新
都是讲2个事物并发执行的时候一个事物覆盖了另外一个未提交的事物的值
一个事物的回滚覆盖了另外一个事物的提交。
(2)脏读
a事物度读取了b事物未提交的值(修改过的值),b事物回滚。
(3)不可重复读
一个事物b读取了另一个未提交事物a的值x=10,a回滚读到x=0,b第二次读到的数据和第一次不一致。
(4)幻读
同样的查询条件由于a事物插入了数据 导致读到的数据量不一样。比如b读取x=10的数据有1条数据,a插入20条x=10的数据,b再次读取就有21条了。
2. 不同数据库的隔离级别
所有的数据库事物都不会允许脏写
所以有
脏读 可重复读 幻读
读未提交 x x x
读已提交 √ x x
可重读读 √ √ x
串行化 √ √ √
-
三段锁协议
x 锁:写锁,在未释放前其他事物对这条记录不能加s锁和x锁;s 锁:读锁,在未释放前其他事物对这条记录能加s锁不能加x锁一段锁协议是指在事物中写数据时必须加x锁;加了x锁就可以其他事物就必须等待释放掉,不会出现2个不同事物修改到同一个事物的值,就能解决掉脏写和丢失更新。读数据不会加任何锁,所以就算a加了写锁,b事物也能直接都到脏数据。
二段锁协议是在一段锁协议的基础上读取记录会加s锁,并且在未提交前就可以释放掉;从上面脏读的定义b事物想读取要加s锁,而这个时候a如果要修改就会对这条记录加了x锁,b就需要等待a事物结束才能读取(重点在b读的时候要加s锁)。因为b未提交就释放了锁,所以a是可以继续修改记录,这个时候会发生不可重复读。
三段锁协议是在一段锁协议的基础上读取锁会加s锁,并且在提交后才可以释放掉。因为b读取加了s锁,并且直达都事物提交都不会释放,所以a事物在b提交之前都不能加上x锁,就可以防止不可重复读