MSSQL 死锁-形成原因及处理办法


一、死锁形成的原因

在两个或两个以上的任务同时,试图访问被其它事件所锁定的资源时,此时就会造成阻塞,可能会导致死锁。
如下:
事务块1,锁定表A资源
事务块2,锁定表B资源
此时当事务块2,访问表A资源,此时由于事务块1锁定A资源,则产生阻塞
此时事务块1,访问B资源,由于事务块2对B资源的锁定,也造成阻塞

事务块2和事务块1互相的阻塞,形成了一种不可能等待资源解锁的死循环中,我们将这种现象称为死锁现象。


二、死锁的处理办法

2.1 数据库自动处理死锁,数据库会监测内存中处于死锁的对象,然后将其中一个事务牺牲掉,使数据库恢复正常。
2.2 sql脚本编写时,避免死锁
2.2.1 按照同一顺序访问对象
如上所示,我们在事务块1 和事务块2 中都按照先访问表A 再访问表B的方式,对对象进行操作。
2.2.2 事务尽量简短,尽量加快事务的执行速度