参考 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
发表评论