数据库有表X和表An,Bn,Cn,Dn,它们继承自X。
进程1定期从X查询数据。
进程2更新子表中的数据。例如,要更新表An和Bn,它会创建新的表Am和Bm,将数据加载到表中,锁定访问独占的An、Bn,删除An和Bn,并更改Am和Bm以继承X。
问题是,当进程1执行查询(例如select * from X
)时,它以共享模式锁定表An、Bn、Cn、Dn,并且锁定顺序未知。如果进程1锁定Bn,那么进程2锁定一个we有死锁。
postgresql中的查询中是否有关于锁定表顺序的信息(没有显式锁定)?或者是其他可能的解决方案?
最佳答案
我知道你说过没有显式锁定,但老实说你最好的选择是显式锁定。因为这两个批中的第一条语句都有一个lock
命令,用于锁定要使用的表。这方面最重要的一点是,两个lock
命令必须以相同的顺序锁定表,否则无论如何都会再次陷入死锁。
在这之后,请确保两个批处理都尽可能快地运行,因为您使用的是表级锁。。。你不想再抱得太久了。