避免资源死锁:识别已打开的事务

死锁往往由于以下原因引起:
1、程序错误,比如一个事务需要操作两个表,由于程序错误在有时是先操作a表后操作b表,有时是先操作b表后操作a表,就有机会互相等待而造成死锁。
2、事务太大,大事务操作的表多,操作步骤也多,死锁的机会也多。
3、性能问题,有些语句性能太差,长时间的加锁容易与其他事务形成死锁。

因为打开的事务可能会死锁资源,引发性能的问题,所以了解在一个专用数据库中哪些事务是打开的是很有帮助的。被死锁的资源可能堵塞其他数据库的用户。

为了找出这些已打开的事务就要查询master数据库中的sysprocesses表。sysprocesses表有一个open_tran的列,它表示已有命令是否是一个打开的事务。如果值大于0表示它是一个已经打开的事务。sysprocesses表还有一个spid的列,表示正在访问SQL Server的系统进程的id。你可以使用spid列作为DBCC INPUTBUFFER()系统函数的参数。只有SQL Server的sysadmins帐号才可以执行这个函数。这个函数的输出首先是spid对应的255字符的命令。你可以由此确定哪个命令是影响数据库性能的罪魁祸首,然后根据spid发出一个KILL命令。

解决死典型方法:(来自微软http://support.microsoft.com/kb/832524/zh-cn)

添加和删除索引。
添加索引提示。
修改应用程序来访问资源类似模式中。
从事务像触发器删除活动。 默认情况下, 触发器是事务。
保持事务尽可能地短。

原文地址:https://www.cnblogs.com/choi/p/629218.html