SQLServer 中的死锁说明
2022-11-12 09:51:06
内容摘要
这篇文章主要为大家详细介绍了SQLServer 中的死锁说明,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!两个进程发生死锁的典型例子是:进程T
文章正文
这篇文章主要为大家详细介绍了SQLServer 中的死锁说明,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
两个进程发生死锁的典型例子是:进程T1中获取锁A,申请锁B;进程T2中获取锁B,申请锁A,我们下面动手来演示一下这种情况:1. 创建一个Database,名为InvDB。
2. 执行下面脚本创建person表并填充两条数据:
【图片暂缺】
3. 在SQL Server Management Studio的两个窗口中同时执行下面的查询:
【图片暂缺】 | 【图片暂缺】 |
这段代码在默认的READ COMMITTED隔离级别下运行,两个进程分别在获取一个排它锁的情况下,申请对方的共享锁从而造成死锁。
可见一个进程可以正常更新并显示结果,而另一个进程已经被回滚:
(1 row(s) affected)Msg 1205, Level 13, State 45, Line 8Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
4. 启动 SQL Server Profiler,选择下面4种Events:
【图片暂缺】
再执行一次上面的死锁实验,可以看到如下所示的死锁图:
【图片暂缺】
非常有趣的一点是:第二次执行上述语句不会发生死锁!这是因为此时两个进程中,SQL Server会智能的识别出update语句是不需要做的,所以都不会去获取排它锁,当然也就不会死锁了。SQL Server 2008 的查询优化器还真是非常强大!
注:关于SQLServer 中的死锁说明的内容就先介绍到这里,更多相关文章的可以留意
代码注释