sqlserver 简单锁实例

来源:互联网 发布:macos 配置软件 编辑:程序博客网 时间:2024/06/05 17:09


/*以此表为例:SELECT * FROM tb姓名课程分数---------------------张三语文74张三数学83李四语文74李四数学84李四物理94*/--新建第一个会话窗口,执行以下语句:BEGIN TRAN  UPDATE dbo.tb  SET 分数 = 85WHERE 姓名 = '张三'AND课程 = '语文'--COMMIT TRAN--新建第二个会话窗口,执行以下语句:UPDATE dbo.tb  SET 分数 = 90WHERE 姓名 = '张三'AND课程 = '语文'/*此时第二个窗口一直处于执行状态;新建第三个会话窗口,用于分析查看阻塞语句;*/--查看锁的信息,更多信息(sp_lock:http://msdn.microsoft.com/zh-cn/library/ms187749.aspx)exec sp_lock;--SELECT * FROM sys.dm_tran_locks; --比第一个信息多些



--可以看到,会话ID号 spid=54 处于等待状态,mode='U'为更新锁--下面查看 session_id=54 是被什么会话阻塞了.SELECT blocking_session_id, wait_duration_ms, session_id  FROM sys.dm_os_waiting_tasks  WHERE session_id=54go--或EXEC sp_who2 active --BlkBy 被谁阻塞……


--结果为session_id=52阻塞了.接下来看看其运行了什么语句;SELECT t.text  FROM sys.dm_exec_connections c  CROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) t  WHERE c.session_id = 52


--直接删除session_id = 52的会话,此会话的语句中断,后面的语句正常执行;KILL 52SELECT * FROM tb/*姓名课程分数---------------------张三语文90张三数学83李四语文74李四数学84李四物理94*/