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