由于并发,如果不加以控制,就会出现以下问题:丢失修改,不可重复读,幻读(读脏数据)。
解决方法:
1)一级封锁协议
做法:修改对象之前必须加X锁,直到事务结束才能释放。
好处:可防止丢失修改。
2)二级封锁协议
做法:在一级锁的基础上,读取数据之前必须先对其加 S 锁,读完后即可释放 S 锁。
事务T1对C进行修改,加 X锁;事务T2想读C,加 S锁,这个时候因为已经有 X锁,无法加锁。直到 T1修改完后,释放 X锁,才可以加
S锁。
避免了读脏数据。
3)三级封锁协议
为了解决 不可重复读的问题。
出现重复读的情况:事务 T1 对 A读数据之前,加 S锁,然后读完再释放。然后事务T2对A加 X锁,修改了A。事务T1并没有结束,然后
为了验算,再次读,已经不能读到之前的数据了。
在一级锁的基础上,读取数据之前必须先对其加 S 锁,直到事务结束才释放。