今天写代码的时候突然发自己对数据库封锁相关概念有些模糊,现在整理一下。
封锁协议是为了解决数据库数据更新的时候三个问题,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 锁,三级封锁协议解决读脏数据问题,而且防止不可重复读的问题。