从wait_type入手模拟SQL Server Lock
2015-02-08 22:31
525 查看
一、LCK_M_S,等待获取共享锁
开始一SQL TRAN,其中执行对某数据的UPDATE。但并不COMMIT,也不ROLLBACK。
这样,便使用排它锁锁定了该[Employee]表。
在另一会话中,执行对该表的SELECT操作。至此,死锁产生。
使用下列script查询当前锁情况。
发现该LOCK的wait_type为LCK_M_S,意味着后一会话在等待着获取对该表的共享锁已完成查询工作。
二、LCK_M_U,等待获取更新锁。
发起一SQL会话,在其中使用更新锁(UPDLOCK)SELECT数据,而后WAIT一定的时间。
在wait的时间内,[Id]=7的行被更新锁锁住。
发起另一会话,使用更新锁(UPDLOCK)完成SELECT操作。
发现后一会话被block。wait_type为LCK_M_U,表示其在等待该表的更新锁。
三、LCK_M_X,等待获取排它锁
将上一小节中第二个会话的操作改为UPDATE。
后一会话同样被block,但这次的wait_type为LCK_M_X,表明其在等待用于UPDATE DATA的排它锁。
开始一SQL TRAN,其中执行对某数据的UPDATE。但并不COMMIT,也不ROLLBACK。
begin tran update [dbo].[HR_Employee] set [Description]='ZZ'
这样,便使用排它锁锁定了该[Employee]表。
在另一会话中,执行对该表的SELECT操作。至此,死锁产生。
select * from [dbo].[HR_Employee]
使用下列script查询当前锁情况。
SELECT wt.blocking_session_id AS BlockingSessesionId ,sp.program_name AS ProgramName ,COALESCE(sp.LOGINAME, sp.nt_username) AS HostName ,ec1.client_net_address AS ClientIpAddress ,db.name AS DatabaseName ,wt.wait_type AS WaitType ,ec1.connect_time AS BlockingStartTime ,wt.WAIT_DURATION_MS/1000 AS WaitDuration ,ec1.session_id AS BlockedSessionId ,h1.TEXT AS BlockedSQLText ,h2.TEXT AS BlockingSQLText FROM sys.dm_tran_locks AS tl INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id LEFT OUTER JOIN master.dbo.sysprocesses sp ON SP.spid = wt.blocking_session_id CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1 CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
发现该LOCK的wait_type为LCK_M_S,意味着后一会话在等待着获取对该表的共享锁已完成查询工作。
二、LCK_M_U,等待获取更新锁。
发起一SQL会话,在其中使用更新锁(UPDLOCK)SELECT数据,而后WAIT一定的时间。
begin tran select * from [dbo].[HR_Employee] WITH (UPDLOCK) where [Id]=7 waitfor delay '00:01:00' update [dbo].[HR_Employee] set [Description]='ZZ' where [Id]=7 commit tran
在wait的时间内,[Id]=7的行被更新锁锁住。
发起另一会话,使用更新锁(UPDLOCK)完成SELECT操作。
select * from [dbo].[HR_Employee] WITH (UPDLOCK)
发现后一会话被block。wait_type为LCK_M_U,表示其在等待该表的更新锁。
三、LCK_M_X,等待获取排它锁
将上一小节中第二个会话的操作改为UPDATE。
update [dbo].[HR_Employee] set [Description]='ZZy' where [Id]=7
后一会话同样被block,但这次的wait_type为LCK_M_X,表明其在等待用于UPDATE DATA的排它锁。
相关文章推荐
- SQL SERVER CXPACKET-Parallelism Wait Type 的惯用解决方案
- SQLServer ASYNC Network IO waittype
- Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues
- SQL SERVER CXPACKET-Parallelism Wait Type的惯用解决方案
- SQL Server is blocked by CXPACKET(Wait Type)
- SQL SERVER CXPACKET-Parallelism Wait Type 的解决方案
- SQL SERVER CXPACKET-Parallelism Wait Type的惯用解决方案
- Sql server WaitType 日志
- Reducing SQL Server CXPACKET Wait Type
- HOW TO: Change the Owner of a User-Defined Data Type That Is in Use in SQL Server 2000
- MS SQL Server 2008 新特性 - User-Defined Table Type 实现将.NET DataTable作为参数传入数据库
- SQL SERVER SYSTEM OBJECT TYPE
- Sql Server XType
- sql server image type
- sql server data type and CLR data type
- Managed Data Type Mappings (SQL Server Compact Edition)
- sql server xtype 参数解释
- How to select the data type in SQLserver database such as varchar, nvarchar
- ADO.NET Entity Framework: The version of SQL Server in use does not support datatype 'datetime2'
- SQL Server xtype的介绍