ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL SERVER绑定变量导致死锁

SQL SERVER绑定变量导致死锁

原创 Linux操作系统 作者:ORA8SQL 时间:2012-01-31 17:30:32 0 删除 编辑
数据库:SQL SERVER 2008 R2
Keymaker表专门用来保存系统中用到每张表的最大ID。考虑到系统的并发性,客户端调用服务端的WEB SERVICE来取得最大ID。今天项目组过来报告说发生在调用这个WS时发生死锁了。死锁图如下:
 
SPID 1154当前正在执行的SQL语句是:
(@tablename nvarchar(15)) select maxkey from keymaker where tablename=@tablename;
 
 
SPID 1780当前正在执行的SQL语句是:
(@step int ,@tablename nvarchar(15)) update keymaker set maxkey=maxkey+@step where tablename=@tablename
 
考虑到死锁图中SPID 1154 占有X锁请求S锁;而SPID1780占用X锁请求U锁,而争取的资源是RID锁。同时都是占有了X锁,所以不可能是同一条记录,肯定是同一个页面
6929中不同记录,由于keymaker表中的tablename是主健,理论上来说如果能够正确利用主键索引来定位记录的话,应该不会导致导致整个页面要加U锁。怀疑是不是因为执行计划采用了全表的扫描,而不是利用主键来定位记录。查执行计划
 
select  text,plan_handle from sys.dm_exec_cached_plan
cross apply sys.dm_exec_sql_text(plan_handle)
where text like '%keymaker%';
 
找出语句
(@tablename nvarchar(15)) select maxkey from keymaker where tablename=@tablename 的 plan_handle
根据plan_handle找出这个语句的执行计划
select * from sys.dm_exec_query_plan(0x060080...),
果然用的是全表扫描。修改WEB SERVICE将绑定变量去掉,再也没有出现死锁。
疑问:
SQL SERVER 绑定变量这种SQL语句生成执行计划的时候是不是有BUG?没有正确的进行变量窥视?
全表扫描导致死锁的也不是第一次发现了。这个U锁增加了死锁的机率。
SQL SERVER默认情况下的写阻塞了读也增加了死锁的机率。(这个问题其实可以直接设置database read_committed_snapshot on 就可以解决死锁)
 

deadlock.jpg

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26661112/viewspace-715380/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2012-01-31

  • 博文量
    5
  • 访问量
    6922