设为首页 收藏本站
查看: 612|回复: 0

[经验分享] 浅谈Sql 死锁(Dead Lock)

[复制链接]

尚未签到

发表于 2016-11-10 10:34:32 | 显示全部楼层 |阅读模式
浅谈Sql 死锁(Dead Lock)
  
死锁是指进程之间相互block的,并形成一个block环路导致无unblock的情况。死锁必须发生在两个或更多的进程之间,如果是两个进程的话,那就是进程A block了进程B,而进程B也block了进程A.如果是三个进程之间发生死锁的例子有:进程A block了进程B,进程B block了进程C,进程C block 了进程A. Sql Sever在死的情况下会尝试终止某个进程,当然如果系统不中止某个进程或尝试中止失败,这个死锁的进程将一直保持死锁,除非人工干预来结束某个进程。
如果没有指定的话系统默认中止最后一个进程,因为这样是最优的对于要roll back这个事务的操作来说。然而从Sql server 2005起,可以通过设置每个session 的DEADLOCK_PRIORITY(-10~10),2008 可以支持这21个值,但Sql 2005只支持LOW 和NORMAL。系统将选取优先级别最低的进程进行终止。
下面通过一例子来理解下死锁:
A. 打开一个Sql 窗口(窗口1),并执行下列Sql语句
BEGIN TRAN;

UPDATE dbo.Products
SET unitprice = unitprice + 1.00
WHERE productid = 2;
B. 打开一个Sql 窗口(窗口 2),并执行下列Sql语句
BEGIN TRAN;

UPDATE [dbo].[Order Details]
SET unitprice = unitprice + 1.00
WHERE productid = 2;
C. 回到窗口1中执行
SELECT orderid, productid, unitprice
FROM [dbo].[Order Details]
WHERE productid = 2;

COMMIT TRAN;
发现窗口1被窗口2 block
D. 回到窗口2中执行
SELECT productid, unitprice
FROM dbo.Products
WHERE productid = 2;
COMMIT TRAN;
发现窗口2中出现错误:
Msg 1205, Level 13, State 51, Line 1
Transaction (Process ID 54) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
窗口1中事务执行成功。
如何避免和减少死锁呢?
1. 很显然,事务执行的时间越长,他所要用的锁就越多,产生死锁的机会就越大。因此我们需要让事务执行的时间越短越好。把逻辑上不是同一个事务的语句尽量剔除出事务。
2. 有些死锁是由于资源的访问顺序不对,比如上面例子的死锁,如果都把select 语句放在update前面就不会发生死锁了。因此在不影响事务逻辑的情况下应该将Select语句放在update之前
3. 上面的例子是逻辑上出现死锁,因为两个进程都试图访问统一资源并做出不同的操作。然而有些死锁却不是这种逻辑上的死锁,而是出现在没很好地规划索引(查询是用到或过滤).比如假如在窗口2中的两个语句都在过滤product 5, 而此时在窗口一中正在处理product 2, 而窗口2在处理product 5,看起来不应该发生死锁的,因为没有逻辑上的冲突。然而如果没有把productId设置成索引,为了过滤product 5,系统需要扫描(扫描当然要加锁)整个product表。这中情况下当扫描到Product 2时还是会发生死锁。所以好的索引规划可以避免一些并发时的这类非逻辑性死锁。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298362-1-1.html 上篇帖子: SQL 限制账号登入时间 下篇帖子: SQL日期与时间函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表