赞
踩
简单来说:死锁就是多个线程互相抢夺别人已经拥有的资源,但是又互不放手。
死锁的四个条件
互斥条件,一个资源只能被一个线程占用(x锁)
请求和保持条件,需要访问其他资源被阻塞,却又不释放已经占用的资源
不可剥夺条件,线程未主动释放资源前,不可强行剥夺
循环和等待:多个线程之间形成头衔尾,无限循环。
排它锁能满足第一个条件,事务可以满足第2和第3和第四条件,当两个一起用可能出现死锁
例如A表有两条数据,打开ssms两个窗口(两个线程),T_Test2两条数据
session1,开启事务
1.更新表第一行数据
session2 开启事务
2.更新表第二行数据
3.查询表第一行数据
session1
4.查询A表第二行数据,
出现死锁,这种死锁sql server有自己的解决方案,即牺牲掉事务少的那个session。
解决方案可从四个条件入手
1互斥.做dml(select除外),肯定会加x锁
2,请求和保持,让一个线程请求资源时将资源一次性请求出来。比如session1第一步就对两行数据都上锁
3.不可剥夺,sql server 死锁可设置线程超时牺牲(可剥夺)
4.循环和等待,可规定请求数据的顺序相同,可减少死锁发生,比如session1和2都先从第一行开始update
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。