mssql sqlserver 数据库死锁原因及处理方法分享


摘要:
下文通过实例的方式讲述数据库常见的死锁原因及处理方法分享
实验环境:sql server 2008 R2

在平常的系统开发中,数据库是一个供多个用户同时操作数据的资源库,当多个用户同时操作某一个数据时,此时可能会造成大家都无法操作数据,我们将此种情况称之为“死锁”。数据库死锁出现的原因如下所示:

一、用户对数据资源交叉访问,会造成死锁

例: 用户1 访问A表,并锁定A表,然后再访问B表;
用户2 在用户1访问A表的同时,立即访问B表,并且长时间占用B表进行操作,然后再操作A表
此时用户1和用户2的操作就出现了互斥现象,用户1需使用的资源被用户2锁定,用户2需使用的资源被用户1锁定,此种互斥现象就造成了数据库死锁。


针对此种死锁现象的产生,我们需在数据流程的前期,按照一定的流程对用户所涉及的表进行相关操作。


二、避免并发的数据操作

例:
用户1,查询数据表,然后修改相应的记录;
同时用户2也准备此条纪录,
这时用户1的事务中的锁性质由查询的共享锁企图上升到独占锁,
用户2里的独占锁由于”用户1″有共享锁存在所以必须等待”用户1″释放掉共享锁,
而“用户1”由于”用户2″的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁在一些大型项目中,经常出现,由于比较隐蔽,所以比较难发现此类异常现象。

解决方法

在数据行的记录中加入数据行版本信息,作为单条数据的版本号,每个用户修改数据都会带着版本号进行修改。
在数据更新时,先进行查询,如果符合版本号信息,则执行更新。


使用排队机制,对数据操作进行排队操作,使每次操作可都可操作成功。

三、索引异常导致全表扫描

由于索引不当,导致索引进行全表扫描产生,产生了表级锁,出现了阻塞情况发生。
处理方法:
设计合理的索引,避免编写复杂的连接查询