当前位置:   article > 正文

sql server 高级知识梳理四:表死锁简单分析和解决方案_sql server数据库表锁住了怎么办

sql server数据库表锁住了怎么办

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

死锁的四个条件

互斥条件,一个资源只能被一个线程占用(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

 

 

 

 

 

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/759774
推荐阅读
相关标签
  

闽ICP备14008679号