技术开发 频道

SQL Server表锁定原理以及如何解除锁定

  一: 下面以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

 

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

1
 

  其他session对Table只读, 不能更新, 在开一个新的session测试:

select * from Sales.SalesOrderHeader  where SalesOrderID='43662'

go
update Sales.SalesOrderHeader
set OrderDate=GETDATE() where SalesOrderID='43662'

 

  select可以正常执行, update语句一直处于等待状态, 等待上面的session释放锁.

  2. Update locks (U): 更新锁是共享锁和独占锁的组合.用UPDLOCK保持更新锁

USE AdventureWorks2008

BEGIN TRAN
select * from Sales.SalesOrderHeader WITH(UPDLOCK)
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

 

  查看到锁的信息:

1
 

  3.Exclusive locks (X): 独占锁是为了锁定数据被一个session修改的数据, 而不能够被另外的session修改. 只能指定NOLOCK来读取.

USE AdventureWorks2008

BEGIN TRAN

update Sales.SalesOrderHeader
set ShipDate=GETDATE() 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

 

  查看锁:

1
 

  4.Intent locks (I): 意向锁用于建立锁的层次结构. 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。

  数据库引擎使用意向锁来保护共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上。 意向锁之所以命名为意向锁,是因为在较低级别锁前可获取它们,因此会通知意向将锁放置在较低级别上。

  意向锁有两种用途:

  防止其他事务以会使较低级别的锁无效的方式修改较高级别资源。

  提高数据库引擎在较高的粒度级别检测锁冲突的效率。 

0
相关文章