标签归档:死锁

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″的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁在一些大型项目中,经常出现,由于比较隐蔽,所以比较难发现此类异常现象。

解决方法

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


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

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

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

mssql sqlserver select查询会锁表,会使update delete超时


摘要:
下文讲述sqlserver大查询时,无法使用update delete操作的处理方法,如下所示:
实验环境:sql server 2008 R2



我们深知当对数据表执行select操作时,会产生share锁,当数据被共享锁时,其它事务只可对数据读取,无法对数据进行修改操作,
此时对高频更新的数据,则会产生相当大的影响。

当我们对数据的实时性要求不是很高时,我们可以显式的指定select查询时,不对表进行锁定,此举可以避免selectda大查询时,影响其它update delete操作,具体方法如下:

   ---在表后面加上nolock关键字,可使用无锁的方式查询数据库
   select * from tableName with(nolock)
   ---或
   select * from  tableName (nolock)

mssql sqlserver 查看死锁相关信息


摘要:
在业务系统中,由于很多未确定的因素产生,可能会”或多或少”的产生死锁现象,下文将从死锁的原因分析死锁,并给出相关的死锁避免脚本,如下所示:
实验环境:sqlserver 2008 R2



sqlserver产生死锁的原因:

1.系统各种资源不足,导致死锁
2.各种对象的调用,产生互相死锁

sqlserver产生死锁的必要条件:

1.一个资源被一个进程引用时,此时另一个进程无法使用,此时另一个进程就会处于等待状态
2.当前进程A所请求的资源被另一个进程B占用,而进程B所需使用的资源此时正被进程A占用
3.进程所需的资源无法从别地进程中释放出来
4.进程所需的资源无限等待状态