数据库具有表X和从X继承的表An,Bn,Cn,Dn。
处理 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锁定我们有死锁。
是否有关于postgresql中查询中锁定表顺序的任何信息(没有显式锁定)?或者可能有其他解决方案可能吗?
答案 0 :(得分:1)
我知道你说没有明确的锁定,但老实说,你最好的选择是显式锁定。由于两个批处理中的第一个语句都有一个lock
命令,用于锁定要使用的表。关于这一点最重要的部分是lock
命令必须以相同的顺序锁定表,否则无论如何都会再次遇到死锁。
在此之后确保两个批次尽可能快地运行,因为你正在进行表级锁定...你不想再持有它们了。
答案 1 :(得分:0)
是否有关于订单的任何信息 在查询中锁定表 postgresql(没有显式锁定)? 或者可能是其他解决方案 可能的?
通常postgresql的mvcc实现可以保护你免受许多类型的死锁。有关详细信息,请参阅http://www.postgresql.org/files/developer/transactions.pdf。
但是,一个常见的解决方案是只处理死锁,也就是说,如果查询因死锁而失败,请再试一次。?