例如,存在表 A 和表 B,我需要在 A 和 B 中处理更新,我决定在使用期间对它们进行表锁定(按照我的架构师的要求)。同时,调用另一个过程,该表锁定 B,然后锁定 A。
这笔交易会完成吗?我有一种感觉,这是一个死锁,很确定,因为它没有释放任何资源......
例如,存在表 A 和表 B,我需要在 A 和 B 中处理更新,我决定在使用期间对它们进行表锁定(按照我的架构师的要求)。同时,调用另一个过程,该表锁定 B,然后锁定 A。
这笔交易会完成吗?我有一种感觉,这是一个死锁,很确定,因为它没有释放任何资源......
是的,这是一个可能的死锁。
死锁场景是
你的任务锁 A
其他任务锁 B
然后你的任务试图锁定 B 但它不能因为你有锁而其他任务试图锁定 A 但它不能因为你有它。
因此,其中一项任务必须失败/回滚,以便另一项可以完成。根据使用的 RDBMS,db 将选择其中之一来终止。
通常,解决方案是指导您必须在所有进程中以相同的顺序锁定资源,通常这必须手动强制执行。
是的。这种方法将以经典的循环死锁结束,如此处所述
使用表级别锁进行更新是一种矫枉过正。这样做的理由是什么?如果您有正确的索引,则会在键级别获取锁,这有助于多个进程同时访问相关表。
最好的做法是尽可能以相同的顺序访问表。