基于锁的并发控制方法
-
锁是处理并发的一种手段。锁是调度器管理和使用的。
-
0-lp 对写操作上排它锁,写操作结束后立即释放。可以防止丢失修改,允许脏读、不可重复读
-
1-lp对写操作上排它锁,等事务结束后才释放。可以防止丢失修改、脏读 允许不可重复读错误
-
2-lp对写操作上排它锁,等事务结束后释放,对读操作上共享锁,读操作完成后释放。防止丢失修改、脏读、不可重复读。这里我始终有个疑问:为什么通过加共享锁就可重复读呢?不可重复读:这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。 -
3-lp对写操作上排它锁,事务结束之后释放锁,对读操作加上共享锁,事务结束之后释放。可以防止所有的不一致。
-
从上面我们可以看出不同的加锁解锁时机将会解决不同的问题。
-
封锁粒度:属性->元组->元组集合->关系->DB
索引项->索引 -
总结当我们使用封锁协议来解决事务并发时,我们应该考虑加锁的类型、加锁的时机、加锁的粒度、以及涉及到的锁的相容性矩阵。