一、数据库锁介绍
-
数据库锁目的:处理并发问题
-
并发控制主要的技术手段:乐观锁、悲观锁和时间戳
二、数据库锁分类
- 悲观锁(Pessimistic Lock)
正如其名,具有强烈的独特性和排他性,对数据被外界事务修改持保持态度,因此,在数据处理过程中,将数据处于锁定状态。 悲观锁实现主要靠数据库提供的锁机制,来保证数据不被外部系统修改。 - 乐观锁(Optimistic Lock)
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以,不会上锁。 但是在更新的时候会判断一下在此期间别人有没有更新这个数据,可以使用版本号等机制。 - 关系型数据库锁机制(行锁、表锁、共享锁(Share Lock)、排他锁(Exclusive Lock))
- 共享锁(Share Lock)
共享锁也叫读锁,用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。 性质:多个事务可封锁同一个共享页,任何事务都不能修改该页,通常是该页被读取完毕,S锁立即被释放。 - 排他锁(Exclusive Lock)
排他锁也叫写锁,表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。 性质:仅允许一个事务封锁此页,其他任何事务必须等到排他锁被释放才能对该页进行访问,排他锁一直到事务结束才能被释放。 - 更新锁
更新锁,在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。 性质:用来预定要对此页施加排他锁,它允许其他事务读,但不允许再施加更新锁或排他锁,当被读取的页要被更新时,则升级为排他锁,更新锁一直到事务结束时才能被释放。 - 行锁
锁的作用范围是行级别。 - 表锁
锁的作用范围是整张表。 - 活锁
指的是T1封锁了数据R,T2同时也请求封锁数据R,T3也请求封锁数据R,当T1释放了锁之后,T3会锁住R,T4也请求封锁R,则T2就会一直等待下去 解决方法:采用“先来先服务”策略可以避免。 - 死锁
就是我等你,你又等我,双方就会一直等待下去。比如:T1封锁了数据R1,正请求对R2封锁,而T2封住了R2,正请求封锁R1,这样就会导致死锁,死锁这种没有完全解决的方法,只能尽量预防。 解决方法:只能是撤销一个处理死锁代价最小的事务,释放此事务持有的所有锁,同时对撤销的事务所执行的数据修改操作必须加以恢复。
- 共享锁(Share Lock)