• 售前

  • 售后

热门帖子
入门百科

SQLServer 中的死锁说明

[复制链接]
梦想镌刻时光光x 显示全部楼层 发表于 2021-10-26 12:41:05 |阅读模式 打印 上一主题 下一主题
两个历程发生死锁的典范例子是:历程T1中获取锁A,申请锁B;历程T2中获取锁B,申请锁A,我们下面动手来演示一下这种情况: 1. 创建一个Database,名为InvDB。
2. 实行下面脚本创建person表并添补两条数据:
[img=366 border=0,173 alt=image src=]https://www.caogenba.net/[/img]
3. 在SQL Server Management Studio的两个窗口中同时实行下面的查询:
[img=244 border=0,214 alt=image src=]https://www.caogenba.net/[/img] [img=244 border=0,208 alt=image src=]https://www.caogenba.net/[/img]
这段代码在默认的READ COMMITTED隔离级别下运行,两个历程分别在获取一个排它锁的情况下,申请对方的共享锁从而造成死锁。
可见一个历程可以正常更新并表现结果,而另一个历程已经被回滚:
(1 row(s) affected)
Msg 1205, Level 13, State 45, Line 8
Transaction (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:
[img=235 border=0,98 alt=image src=]https://www.caogenba.net/[/img]
再实行一次上面的死锁实行,可以看到如下所示的死锁图:
[img=812 border=0,152 alt=image src=]https://www.caogenba.net/[/img]


非常风趣的一点是:第二次实行上述语句不会发生死锁!这是因为此时两个历程中,SQL Server会智能的识别出update语句是不需要做的,以是都不会去获取排它锁,固然也就不会死锁了。SQL Server 2008 的查询优化器还真黑白常强大!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作