sqlserver 死锁,事务(进程 ID 71)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。(ZT)

2023-12-26 09:40:06  阅读 1929 次 评论 0 条

参考 https://blog.csdn.net/qq_35457078/article/details/85333993

某医院远程操作数据库 偶尔出现SQL SERVER死锁 。参考上述文章

问题简单分析:


因为不同线程在事务中处理相同的数据时,在抢占数据库锁的过程中都拿到了这个表的锁,数据库会采取让一个执行而另一个放弃执行,会导致该错误的出现,即选作死锁牺牲品。


解决:

在update的语句中,加入 WITH (TABLOCKX),对于这个的解释:


排它锁又称为写锁((eXclusive lock,简记为X锁)),若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。


使用如:UPDATE MT_EXP_SUB WITH (TABLOCKX) SET XXX = XXX WHERE ID = X;

加上这个排他锁之后,这个死锁的问题变解决了。


UPDATE 应付账_明细 WITH (TABLOCKX)  set  记账人='jinesc', 凭证号='12345' where idd=56789


本文地址:http://jinesc.net/?id=302
免责声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?