事务的并发控制的知识点


1.不一致

例:甲售票处(事务T1)读出某航班机票余额A=16

      乙售票处(事务T2)读出同一航班机票余额A=16

(1)丢失修改

甲售出一张机票A=15

乙也售出一张机票A还是=15

T2提交的结果破坏T1结果,导致T1修改丢失

(2)不可重复读

第一种情况:T1读取A=16,T2将A的值改为20,当T1再次读取A时,得到与第一次结果不同。

第二三种情况:T1按一定条件从数据库中读取了某些数据记录后,T2删除了(插入)一些记录,当T1再次按相同条件读取记录时得到结果与第一次不同。

(3)脏读

T1将A=16改成A=20将其写入磁盘,T2读取A=20,T1由于某些原因被撤销其改动恢复原值16,T2所读A的值与数据库中的数据不一致,所读的数据就为“脏”数据。

2.封锁(事务对某个数据对象例如表、记录等操作之前,先向事务发出请求,对其加锁)

(1)排它锁(事务T1对数据对象A加上X锁,只允许T1读取和修改A,其他事务都不能对A加任何类型锁,直到T1释放A)

若修改后解锁:避免丢失修改,无法避免读“脏”数据

若事务结束后解锁:避免读“脏”数据

(2)共享锁(事务T1对数据对象A加上S锁,只允许T1读取但不能修改A,其他事务只能对A加S锁,不能加X锁,直到T1释放A)

若读取后解锁:避免读“脏”数据,不可重复读

若事务结束后解锁:可重复读

3.封锁协议

(1)一级:事务T在修改数据R之前必须先对其加排它锁,事务结束后释放

(2)二级:一级封锁协议,事务T在修改数据R之前必须先对其加共享锁,事务结束前释放

(3)三级:一级封锁协议,事务T在修改数据R之前必须先对其加共享锁,事务结束后释放

4.活锁:

事务T1封锁了数据R,事务T2又请求封锁R,T2等待,T3也请求封锁R,当T1解除对R的封锁首先批准T3的请求,T2仍然等待;这时T4请求封锁R,T3释放R之后批准T4的请求。。。T2有可能一直等待。

死锁:

事务T1封锁R1,T2封锁R2,T1又请求封锁R2,因为T2已经封锁了R2,T1只有等待T2解除封锁才能批准请求,T2同样请求封锁R1,同以上情况。出现T1等待T2解除封锁,T2等待T1解除封锁的局面。

遵守两段锁协议,违背一次封锁法会出现死锁情况。

5.意向锁

(1)IS锁:如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加 S锁

(2)IX锁:如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。

(3)SIX锁:如果对一个数据对象加 SIX锁,表示对它加 S锁,再加IX锁,即 SIX=S+IX。


猜你喜欢

转载自blog.csdn.net/xtt_3170707038/article/details/80646584
今日推荐