数据库-锁

当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性。

数据库锁出现的目的:处理并发问题

 

执行步骤/原理:

  1. 任何事务,都必须加锁后才能执行
  2. 只有当所针对的数据上:
    • 已经有锁,而且和要加的锁相冲突,不能加锁和执行,需要等待之前的锁被释放
    • 没有锁,或者现有锁和要加的锁兼容,可以加锁并执行
  3. 事务结束,取消该事务加上的锁

 

类型

  • S:共享锁:用于只读的SELECT。加锁之后其他用户不能修改,可避免幻影读和不可重复读。为了演示,使用WITH(HOLDLOCK)让锁一直保持到事务结束
  • X:独占(排他)锁:用于INSERT/UPDATE/DELET。加锁之后其他用户不能读(能不能改呢?)。可避免???
  • U:更新锁:用于在UPDATE/DELET之前的查找。查找过程中使用的就是U-LOCK;一旦查找到需要的数据,U-LOCK就转变成X-LOCK(为什么需要更新锁?提高性能,避免死锁)
  • I:意向锁:在需要加锁节点的上一级加上“意向锁”,可以提高锁查找的性能。比如在需要在某一行上加X锁,就可以在KEY的上一级PAGE(甚至是TABLE级)加IX意向锁,这样当另一个事务想要在这张表上加锁的时候,就不需要全表扫描直到加X锁的行……

 

容性:

在已经加锁的数据上再加锁时,如果兼容就可以加,否则就只能等待(详见:MSDN

锁的运行由SQL SERVER自行管理。一般不推荐直接人为干预,以避免导致一系列复杂的问题。

 

死锁
 
定义:就是我等你,你又等我,双方就会一直等待下去。比如:T1封锁了数据R1,正请求对R2封锁,而T2封住了R2,正请求封锁R1,这样就会导致死锁,死锁这种没有完全解决的方法,只能尽量预防。

预防方法:
 1. 一次封锁法,指的是一次性把所需要的数据全部封锁住,但是这样会扩大了封锁的范围,降低系统的并发度;
 2. 顺序封锁法,指的是事先对数据对象指定一个封锁顺序,要对数据进行封锁,只能按照规定的顺序来封锁,但是这个一般不大可能的。
系统判定死锁的方法:

超时法:如果某个事物的等待时间超过指定时限,则判定为出现死锁;
等待图法:如果事务等待图中出现了回路,则判断出现了死锁。

对于解决死锁的方法,只能是撤销一个处理死锁代价最小的事务,释放此事务持有的所有锁,同时对撤销的事务所执行的数据修改操作必须加以恢复。
 
posted @ 2022-02-12 16:43  码上的飞鱼  阅读(78)  评论(0)    收藏  举报