- UID
- 418
- 精华
- 积分
- 3994
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
DBMS为了实现并发控制,通常给各个事务所用到的资源加锁。但是加锁后会出现死锁与活锁两大问题。
1.死锁问题:首先事务T1对A加了写锁,然后事务T2对B加了读锁。接着T1想对B进行写入因此请求对B加写锁。但是因为B身上拥有T1加好的读锁。根据三级封锁协议,已经加了读锁的数据只能再加读锁,而不能加写锁。于是T1等待T2释放读锁以供自己对B加上写锁。而此时T2申请读数据A。又根据三级封锁协议:被加了写锁的数据上不能被别的事务加其它任何锁,因此T2等待T1释放A的写锁。两事务互不相让发生死锁。举例:A国抱怨B国不承认历史,B国抱怨A国侵犯领土。AB两国互不相让冤冤相报,死锁产生。
2.活锁问题:事务T1先对A加了读锁,然后事务T2等待请求对A加写锁,接着T3请求对A加读锁。根据三级封锁协议数据X被一个事务加了读锁以后,可以被其它事务再次加读锁。所以T3申请成功。接着T4请求对A加读锁,成功,T5请求对A加读锁,成功……T1的写锁一直处于等待状态,T1对A的加写锁请求一直得不到满足,事务T1假死。举例A申请补助金后B也想申请,但是因为某些原因B被迫排在晚来的C后面,不巧因为某种原因B又被D插队,被E插队……B成了受气包,积累了对DBMS的怨恨。
总结:事务发生死锁和活锁问题严重影响了DBMS的正常工作。但是解决死锁问题的等待图法和解决两个问题并且为大多数DBMS所采用的超时法不在本帖讨论范畴,故不做讨论。 |
|