前面谈了,如果不对事务的并发问题作控制,则会产生一系列的问题。
X 锁和 S 锁
X 锁(exclusive locks,排他锁) 如果事务 T 对数据 A 加了 X 锁,则:事务 T 可对数据 A 进行读取和修改;其他事务不能对数据 A 加任何锁,也不能读取和修改数据 A。
S 锁(share locks,共享锁) 如果事务 T 对数据 A 加了 S 锁,则:事务 T 可对数据 A 进行读取,但不能修改;其他事务也能对数据 A 加 S 锁,但不能加 X 锁。
封锁协议
一级封锁协议 在事务 T 修改数据 A 之前,对数据 A 加上 X 锁,直到事务结束才释放,解决了丢失更新的问题。
二级封锁协议 在一级封锁协议的基础上,在事务 T 读取数据 A 之前,对数据 A 加上 S 锁,直到读取结束才释放,解决了脏读的问题。
三级封锁协议 在一级封锁协议的基础上,在事务 T 读取数据 A 之前,对数据 A 加上 S 锁,直到事务结束才释放,解决了不可重复读的问题。
两段封锁协议 对任何数据进行读写之前必须对该数据加锁,在释放一个封锁之后,事务不再申请和获得任何其他封锁,这样缩短了封锁时间,提高了并发性,同时解决了数据不一致的问题。