0

例如,存在表 A 和表 B,我需要在 A 和 B 中处理更新,我决定在使用期间对它们进行表锁定(按照我的架构师的要求)。同时,调用另一个过程,该表锁定 B,然后锁定 A。

这笔交易会完成吗?我有一种感觉,这是一个死锁,很确定,因为它没有释放任何资源......

4

2 回答 2

1

是的,这是一个可能的死锁。

死锁场景是

你的任务锁 A
其他任务锁 B

然后你的任务试图锁定 B 但它不能因为你有锁而其他任务试图锁定 A 但它不能因为你有它。

因此,其中一项任务必须失败/回滚,以便另一项可以完成。根据使用的 RDBMS,db 将选择其中之一来终止。

通常,解决方案是指导您必须在所有进程中以相同的顺序锁定资源,通常这必须手动强制执行。

于 2012-07-18T17:41:08.913 回答
1

是的。这种方法将以经典的循环死锁结束,如此处所述

使用表级别锁进行更新是一种矫枉过正。这样做的理由是什么?如果您有正确的索引,则会在键级别获取锁,这有助于多个进程同时访问相关表。

最好的做法是尽可能以相同的顺序访问表。

于 2012-07-24T18:16:32.793 回答