2条update也会死锁?
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




