死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计的潜在问题,一些不易捕捉的死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起的键查找死锁及相关的解决办法.
这里我们在测试的同时开启trace PRofiler跟踪死锁视图(locks:deadlock graph).(当然也可以开启跟踪标记,或者应用扩展事件(xevents)等捕捉死锁)
创建测试对象code
create table testklup(clskey int not null,nlskey int not null,cont1 int not null,cont2 char(3000))create unique clustered index inx_cls on testklup(clskey)create unique nonclustered index inx_nlcs on testklup(nlskey) include(cont1)insert into testklup select 1,1,100,'aaa'insert into testklup select 2,2,200,'bbb'insert into testklup select 3,3,300,'ccc'
开启会话1 模拟高频update操作
----模拟高频update操作 declare @i intset @i=100while 1=1 begin update testklup set cont1=@i where clskey=1 set @i=@i+1 end
开启会话2 模拟高频select操作
----模拟高频select操作declare @cont2 char(3000)while 1=1begin select @cont2=cont2 from testklup where nlskey=1end
此时开启会话2执行一小段时间时我们就可以看到类似错误信息:图1-1
新闻热点
疑难解答