今天写代码的时候突然发自己对数据库封锁相关概念有些模糊,现在整理一下。
封锁协议是为了解决数据库数据更新的时候三个问题,1丢失更新,2读脏数据,3不可重复读这三个概念。
造成原因
1.丢失更新,一个事务更新覆盖了另一个事务的结果。
例如- 用户A将数据从100改为99,而用户B将数据从99改成100,这样用户A的数据操作丢失了。
2.读脏数据,事务T1修改某一数据,将其写回磁盘,事务T2读取同一数据后,由于某一原因,事务T1要求回滚,这时,T1数据被恢复成原来的数据,而T2读取到的数据与数据库中的数据不一致,是错误数据,又称脏数据。
3.不可重复读,事务T1读取数据后,事务T2执行了更新操作,T1使用的仍是更新前的数据,造成了数据不一致性。
解决方法
封锁技术
这里的锁分两种,一种是排他锁(X锁),一种是共享锁(S锁)。
排他锁-只允许事务T对数据对象A进行读/写操作。
共享锁-允许所有事务对数据进行读,不允许写操作。
封锁协议
一级封锁协议,事务在修改数据A之前必须对其加X锁,直到结束才释放。一级封锁协议解决了数据更新丢失问题。
二级封锁协议,在一级封锁协议上,加上事务T在读取数据A之前必须加S锁,读完后释放S锁,二级封锁协议解决读脏数据问题。
三级封锁协议,在一级封锁协议上,加上事务T在读取数据A之前必须加S锁,直到事务结束才释放S锁,三级封锁协议解决读脏数据问题,而且防止不可重复读的问题。