CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

2条update也会死锁?

楼主liyiding23(代码人生)2006-01-19 17:11:41 在 MS-SQL Server / 疑难问题 提问

A:用户2006-01-19   11:19:57.17   spid2    
  Input   Buf:   Language   Event:   update   salesdetail   set   lot_no='WO4J2284',expiry_date=NULL   where   id=456001  
   
  B:用户2006-01-19   14:02:10.10   spid2  
  Input   Buf:   Language   Event:   update   salesdetail   set   lot_no='WO5D2053',expiry_date=NULL   where   id=458940  
   
  ------------------------------ 问题点数:100、回复次数:16Top

1 楼zlp321002(Life Is Good,Let's Shine)回复于 2006-01-19 17:23:38 得分 50

--把它放到事务中,加排它锁,试试  
   
  SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ  
  begin   tran  
  update   salesdetail     WITH   (XLOCK)   set   lot_no='WO4J2284',expiry_date=NULL   where   id=456001  
  commit   tran  
   
  SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ  
  begin   tran  
  update   salesdetail     WITH   (XLOCK)   set   lot_no='WO5D2053',expiry_date=NULL   where   id=458940  
  commit   tran  
  Top

2 楼happyflystone(无枪的狙击手)回复于 2006-01-19 17:26:26 得分 0

从时间上来看相差太久了吧Top

3 楼mislrb(上班看看早报,上上CSDN,下班看看电影)回复于 2006-01-19 17:28:01 得分 5

學習Top

4 楼zheninchangjiang(徐若涵)回复于 2006-01-19 19:20:58 得分 0

这个是不会的,注意一下set   implicit_transactions    
  这个应该是由程序操作的,所以不太可能,看看还有没有其他因素.Top

5 楼zjcxc(邹建)回复于 2006-01-19 20:11:53 得分 40

这是有可能的.  
   
  例如,   当你的事务隔离级别设置在   Repeatable   READ   或者以上时.  
   
  由于执行UPDATE前会对读取的记录进行SELECT,   然后才会   UPDATE.  
  对于用户A的UPDATE语句,   在SELECT时,   会对检索的记录下共享锁,     UPDATE会再共享锁转换为独占锁.   由于事务隔离级别在在   Repeatable   READ   (或者以上),   因此在SELECT完成之后,   UPDATE之前,   共享锁会一直保持  
  这个时候如果用户B的UPDATE语句也开始扫描记录,   并且对用户A扫描过已经下了共享锁的记录再次下共享锁(共享锁不是互拆的),   此时会导致两个用户的共享锁都无法转换成独占锁,   这样两个用户都无法完成UPDATE,   这就造成了死锁.  
   
  如果两条UPDATE同时执行,Top

6 楼zjcxc(邹建)回复于 2006-01-19 20:13:11 得分 0

一般来说,   UPDATE中的SELECT时间都会很少,   所以楼主的死锁一般都不会发生,   但绝大不能排除不发生的情况.Top

7 楼ReViSion(和尚)回复于 2006-01-19 20:52:18 得分 5

帮顶呀,Top

8 楼liyiding23(代码人生)回复于 2006-01-27 10:38:28 得分 0

那如何让这两条命令可以在同时发生的情况下顺利的完成而不出现死锁?Top

9 楼liyiding23(代码人生)回复于 2006-01-27 12:46:56 得分 0

zjcxc(邹建)    
  什么时候出锁定的书,我买了你的书呢老大,锁是个大问题:(Top

10 楼liyiding23(代码人生)回复于 2006-01-31 01:41:26 得分 0

自己UP一下,用XLOCK???有好多这种存储过程,代价好象太大了。Top

11 楼zheninchangjiang(徐若涵)回复于 2006-01-31 08:45:24 得分 0

程序设计有问题吧,在事务中间有用户交互输入,或者是其他原因Top

12 楼liyiding23(代码人生)回复于 2006-02-06 11:30:36 得分 0

-_-~~~   是不是用xlock   就可以搞定的说?会不会开消太大?Top

13 楼erp1998(三清)回复于 2006-02-06 12:08:21 得分 0

帮顶Top

14 楼lalakid(梦想总是那么美好……)回复于 2006-02-06 12:24:26 得分 0

挖靠,邹老大的红色内裤真不错啊  
  给我一个Top

15 楼javanow(骄子数据库技术网)回复于 2006-02-06 13:54:57 得分 0

偶尔死锁是正常的,也是不可能避免的。  
   
  你的2个进程间隔时间太久了,不太可能是这二个进程死锁的,因为系统很快可以判定2个进程是否死锁,从而牺牲其中一个进程。这个时间通常是60秒钟以内。  
   
  当然这2条语句是有可能互相死锁的,但你可能没正确抓到当时的语句。  
   
  --------------------------  
  http://chinadba.cn  
  深圳骄子数据库服务网  
  最具实战经验的数据库优化、管理、设计、培训。Top

16 楼liyiding23(代码人生)回复于 2006-02-09 12:55:57 得分 0

上面的时间可能打错了.Top

相关问题

  • 多条insert/update语句,多人同时提交是否会造成死锁!马上给分!
  • 死锁
  • update每秒20次,出现死锁,给为帮忙!
  • 这种情况是不是也是“死锁”了,如何解决?
  • 查询语句也能引起死锁吗?在线等
  • 死锁问题
  • 死锁问题
  • 死锁问题
  • 死锁问题
  • 线程死锁

关键词

  • 用户
  • date
  • null
  • 死锁
  • xlock
  • salesdetail
  • expiry
  • wo
  • 进程
  • 事务

得分解答快速导航

  • 帖主:liyiding23
  • zlp321002
  • mislrb
  • zjcxc
  • ReViSion

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo