--把它放到事务中,加排它锁,试试SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
update salesdetail WITH (XLOCK) set lot_no='WO4J2284',expiry_date=NULL where id=456001
commit tranSET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
update salesdetail WITH (XLOCK) set lot_no='WO5D2053',expiry_date=NULL where id=458940
commit tran
begin tran
update salesdetail WITH (XLOCK) set lot_no='WO4J2284',expiry_date=NULL where id=456001
commit tranSET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
update salesdetail WITH (XLOCK) set lot_no='WO5D2053',expiry_date=NULL where id=458940
commit tran
这个应该是由程序操作的,所以不太可能,看看还有没有其他因素.
对于用户A的UPDATE语句, 在SELECT时, 会对检索的记录下共享锁, UPDATE会再共享锁转换为独占锁. 由于事务隔离级别在在 Repeatable READ (或者以上), 因此在SELECT完成之后, UPDATE之前, 共享锁会一直保持
这个时候如果用户B的UPDATE语句也开始扫描记录, 并且对用户A扫描过已经下了共享锁的记录再次下共享锁(共享锁不是互拆的), 此时会导致两个用户的共享锁都无法转换成独占锁, 这样两个用户都无法完成UPDATE, 这就造成了死锁.如果两条UPDATE同时执行,
什么时候出锁定的书,我买了你的书呢老大,锁是个大问题:(
http://chinadba.cn
深圳骄子数据库服务网
最具实战经验的数据库优化、管理、设计、培训。