1.了解锁
锁定是数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制。
在事务获取数据块当前状态的依赖关系之前,它必须保护自己不受其他事务对同一数据进行修改的影响。
锁粒度和层次结构
RID 用于锁定堆中的单个行的行标识符。
KEY 索引中用于保护可序列化事务中的键范围的行锁。
PAGE 数据库中的 8 KB 页,例如数据页或索引页。
EXTENT 一组连续的八页,例如数据页或索引页。
HOBT 堆或 B 树。保护索引或没有聚集索引的表中数据页堆的锁。
TABLE 包括所有数据和索引的整个表。
FILE 数据库文件。
APPLICATION 应用程序专用的资源。
METADATA 元数据锁。
ALLOCATION_UNIT 分配单元。
DATABASE 整个数据库。
锁模式:
共享锁(S):用于只读操作(SELECT),锁定共享的资源。共享锁不会阻止其他用户读,但是阻止其他的用户写和修改。
排他(独占)锁(X): 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。
更新锁(U): 当更新事务数据需要获取排它锁时,必须先获取更新琐。引擎为防止死锁的发生,一次允许允许一个事务可以获得资源的更新锁(U 锁),只有获取更新锁的查询才可创建排它锁。
意向锁: 用于建立锁的层次结构。意向锁的类型有:意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。引擎在创建共享锁和独占锁之前,先使用意向锁来保护共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上
架构锁(Sch-M):执行表的数据定义语言 (DDL) 操作时使用架构锁。在架构修改锁起作用的期间,该锁之外的所有操作都将被阻止.
大容量更新锁(BU 锁):当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新锁。大容量更新锁(BU 锁)允许多个线程将数据并发地大容量加载到同一表,同时防止其他不进行大容量加载数据的进程访问该表。
监视与管理锁
使用 SQL Server Profiler监视Locks 事件,来捕获有关跟踪中锁事件的信息的锁事件类别。
使用系统监视器监视SQL Server Locks 对象,监视数据库引擎实例中的锁级别。
查询 sys.dm_tran_locks 动态管理视图获得有关数据库引擎 实例中锁当前状态的信息。
使用系统存储过程sp_lock (Transact-SQL) 返回有关数据库引擎实例中的活动锁的信息。对于 SQL Server 2005,请改用 sys.dm_tran_locks 动态管理视图。
使用系统视图sys.syslockinfo (Transact-SQL)返回有关数据库引擎 实例中的活动锁的信息。对于 SQL Server 2005,请改用 sys.dm_tran_locks 动态管理视图。
将死锁减至最少
按同一顺序访问对象。
避免事务中的用户交互。
保持事务简短并处于一个批处理中。
使用较低的隔离级别。
使用基于行版本控制的隔离级别。
将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON,使得已提交读事务使用行版本控制。
使用快照隔离。
使用绑定连接。