SQL Server中表锁定的原理及解锁演示

网络整理 - 07-27

  有几个朋友留言建议结合例子来演示一下, 上篇已经说过锁的几种类型, 可以利用系统动态视图sys.dm_tran_locks查看到,重要的栏位如下:

  resource_type被锁的资源类型(Database, FILE, Object,PAGE,KEY,EXTENT,RID,APPLICATION,METADATA,HOBT,APPOCATION_UNIT)

  request_mode锁的类型(共享锁,更新锁,排它锁, 架构锁等)

  resource_description资源描述

  request_session_idRequest session ID

  一: 下面以AdventureWorks2008为示例数据库做简要的说明,

  过滤掉一般的数据库的共享锁, 作为示例必须要看到锁, 所以用WITH(HOLDLOCK)来保持锁.

  1. Shared locks (S) 共享锁

  USE AdventureWorks2008 BEGIN TRAN select * from Sales.SalesOrderHeader WITH(HOLDLOCK) where SalesOrderID='43662' SELECT resource_type, request_mode, resource_description,request_session_id, DB_NAME(resource_database_id)as resource_database FROM sys.dm_tran_locks WHERE resource_type <> 'DATABASE' --ROLLBACK TRAN

  在事务回滚之前, 查看锁的类型:

  

  四: 总结

  锁的原理比较抽象,对用户来说是透明的,不用过多的关注. 应用程序一般不直接请求锁. 锁由数据库引擎的一个部件(称为“锁管理器”)在内部管理. 当数据库引擎实例处理Transact-SQL 语句时, 数据库引擎查询处理器会决定将要访问哪些资源. 查询处理器根据访问类型和事务隔离级别设置来确定保护每一资源所需的锁的类型. 然后, 查询处理器将向锁管理器请求适当的锁. 如果与其他事务所持有的锁不会发生冲突, 锁管理器将授予该锁