锁
一些概念
共享锁【S锁】 – Shared Lock
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
也就是共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
更新锁【U锁】 – Update Lock
更新锁可以防止通形式的死锁,是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为排他锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。
一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享锁(S),然后修改行,此操作要求锁转换为排它锁(X)。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它锁(X)。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它锁(X)以进行更新。由于两个事务都要转换为排它锁(X),并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新锁(U)。一次只有一个事务可以获得资源的更新锁(U)。如果事务修改资源,则更新锁(U)转换为排它锁(X)。否则,锁转换为共享锁。
-- RowLock 配合 UpdLock 使用,当数据被Update的时候,锁将被释放 select * from tablename with (RowLock, UpdLock) where id = 1排他锁【X锁】 – Exclusive Lock
排他锁又称写锁或者独占锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
排他锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用排他锁。但当对象上有其它锁存在时,无法对其加排他锁。排他锁一直到事务结束才能被释放。
- 对比
- 共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。
- 排它锁,也称作排他锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。
死锁排查
- 第一种 图形化监听
- sqlserver –> 工具 –> sql server profiler 登录后在跟踪属性中设置
- 跟踪属性 –> 事件选择 –> Locks –> 勾选 Lock:Deadlock 等
- 可以在页面查看监听到的死锁图形
- sqlserver –> 工具 –> sql server profiler 登录后在跟踪属性中设置
- 第二种 略
参考文档
- sql server 死锁排查
- sql server中死锁排查的全过程分享
- 详解共享锁(S锁)和排它锁(X锁)
- sql server行级锁,排它锁,共享锁的使用
- Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁
- 将死锁减至最少
- SQLSERVER中的锁资源类型RID KEY PAG EXT TAB DB FIL
- 聚集索引和非聚集索引的区别
- sqlserver 死锁原因及解决方法
首页 > 学习总览 > 开发语言 > SQL server