我有一个表 A,它引用了另外两个表 B 和 C。我想了解当我删除 A 时到底发生了什么。
当删除A时,我的理解是需要在A和B上获取访问独占锁(主要是为了删除触发器?)。
我很好奇这些锁是如何完成的:B 和 C 上的锁是否同时获取?或依次?
如果这是前者可以解释我有时在删除表时注意到的一些死锁
谢谢
我有一个表 A,它引用了另外两个表 B 和 C。我想了解当我删除 A 时到底发生了什么。
当删除A时,我的理解是需要在A和B上获取访问独占锁(主要是为了删除触发器?)。
我很好奇这些锁是如何完成的:B 和 C 上的锁是否同时获取?或依次?
如果这是前者可以解释我有时在删除表时注意到的一些死锁
谢谢
你是对的:如果你删除一个表,它的所有外键约束也会被删除,并且删除引用表上的系统触发器需要
ACCESS EXCLUSIVE
那里的锁。这些锁都是DROP TABLE
在同一事务中的语句执行期间获取的。这些锁将被一个接一个地获取,因此如果您有另一个事务需要这些表,则很容易出现死锁。