加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver 简单锁实例

发布时间:2020-12-12 13:55:06 所属栏目:MsSql教程 来源:网络整理
导读:/*以此表为例:SELECT * FROM tb姓名课程分数---------------------张三语文74张三数学83李四语文74李四数学84李四物理94*/--新建第一个会话窗口,执行以下语句:BEGIN TRAN UPDATE dbo.tb SET 分数 = 85WHERE 姓名 = '张三'AND课程 = '语文'--COMMIT TRAN--新


/*以此表为例:
SELECT * FROM tb

姓名	课程	分数
---------------------
张三	语文	74
张三	数学	83
李四	语文	74
李四	数学	84
李四	物理	94
*/


--新建第一个会话窗口,执行以下语句:
BEGIN TRAN  
	UPDATE dbo.tb  
	SET 分数 = 85
	WHERE 姓名 = '张三'
	AND	课程 = '语文'
--COMMIT TRAN


--新建第二个会话窗口,执行以下语句:
	UPDATE dbo.tb  
	SET 分数 = 90
	WHERE 姓名 = '张三'
	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=54
go

--或
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 52

SELECT * FROM tb
/*
姓名	课程	分数
---------------------
张三	语文	90
张三	数学	83
李四	语文	74
李四	数学	84
李四	物理	94

*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读