sql server 高级知识梳理四:表死锁简单分析和解决方案

死锁是指多个线程因互相争夺资源并持有不放导致的僵局。文章列举了死锁的四个必要条件:互斥、请求和保持、不可剥夺及循环等待,并通过SQLServer中的事务死锁示例解释了问题。解决方案包括一次性请求所有资源、设置线程超时以及规范资源请求顺序以减少死锁的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单来说:死锁就是多个线程互相抢夺别人已经拥有的资源,但是又互不放手。

死锁的四个条件

互斥条件,一个资源只能被一个线程占用(x锁)

请求和保持条件,需要访问其他资源被阻塞,却又不释放已经占用的资源

不可剥夺条件,线程未主动释放资源前,不可强行剥夺

循环和等待:多个线程之间形成头衔尾,无限循环。

排它锁能满足第一个条件,事务可以满足第2和第3和第四条件,当两个一起用可能出现死锁

例如A表有两条数据,打开ssms两个窗口(两个线程),T_Test2两条数据

a3d5bc944a3f40feaaf6adfa55954ebf.png

session1,开启事务

1.更新表第一行数据

a7dad4b77f1c411696993f5a7fbf2094.png

session2 开启事务

2.更新表第二行数据

3.查询表第一行数据

87bbdf9b20b2445884bd67ce6cb2d06e.png

session1

4.查询A表第二行数据,

83f39ebcf8f94cfebf15ebdb5247f5c0.png

出现死锁,这种死锁sql server有自己的解决方案,即牺牲掉事务少的那个session。

 

 

解决方案可从四个条件入手

1互斥.做dml(select除外),肯定会加x锁

2,请求和保持,让一个线程请求资源时将资源一次性请求出来。比如session1第一步就对两行数据都上锁

3.不可剥夺,sql server 死锁可设置线程超时牺牲(可剥夺)

4.循环和等待,可规定请求数据的顺序相同,可减少死锁发生,比如session1和2都先从第一行开始update

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值