一: 下面以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
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
在事务回滚之前, 查看锁的类型:

其他session对Table只读, 不能更新, 在开一个新的session测试:
select * from Sales.SalesOrderHeader where SalesOrderID='43662'
go
update Sales.SalesOrderHeader set OrderDate=GETDATE() 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
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
查看到锁的信息:

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
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
查看锁:

4.Intent locks (I): 意向锁用于建立锁的层次结构. 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。
数据库引擎使用意向锁来保护共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上。 意向锁之所以命名为意向锁,是因为在较低级别锁前可获取它们,因此会通知意向将锁放置在较低级别上。
意向锁有两种用途:
防止其他事务以会使较低级别的锁无效的方式修改较高级别资源。
提高数据库引擎在较高的粒度级别检测锁冲突的效率。