浏览模式: 普通 | 列表
7月, 2010 | 1

处理死锁的存储过程

[ 2010-07-29 14:21:34 | 作者: admin ]
/*--处理死锁

查看当前进程,或死锁进程,并能自动杀掉死进程

因为是针对死的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程

--邹建 2004.4--*/

/*--调用示例

exec p_lockinfo
--*/
create proc p_lockinfo
@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
as
declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),标志,
...

阅读全文…

VARCHAR类型造成SQL SERVER经常死锁

[ 2010-07-29 14:18:21 | 作者: admin ]
SQL SERVER死锁的问题断断续续追踪了两三个星期,终于有个初步的判断:有一个SELECT语句和一个UPDATE语句需要获取大量的锁。死锁应该与之相关。
应用程序在SQL中为每个传入的字符串参数加了N,表示是unicode字符串。在参数与相应的列进行匹配的时候,如果该列不是NVARCHAR而是VARCHAR类型,则SQL SERVER要对该列的数据进行转换,由于此转换而导致不能使用索引,会获取大量的键锁、页锁。如果几个这样的SQL同时执行则容易死锁。
比如这样几句SQL:
declare @P1 int
set @P1=14
exec sp_prepexec @P1 output, N'@P1 nvarchar(4000)', N'SELECT CMDOCUMENTS.*, CMDOCTYPES.DOCTYPENAME, CMDOCCONTENTS.CONTENTSIZE, ...

阅读全文…
1