查询中的锁定顺序(postgresql)

时间:2010-06-27 20:43:52

标签: sql postgresql inheritance locking deadlock

数据库具有表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中查询中锁定表顺序的任何信息(没有显式锁定)?或者可能有其他解决方案可能吗?

2 个答案:

答案 0 :(得分:1)

我知道你说没有明确的锁定,但老实说,你最好的选择显式锁定。由于两个批处理中的第一个语句都有一个lock命令,用于锁定要使用的表。关于这一点最重要的部分是lock命令必须以相同的顺序锁定表,否则无论如何都会再次遇到死锁。

在此之后确保两个批次尽可能快地运行,因为你正在进行表级锁定...你不想再持有它们了。

答案 1 :(得分:0)

  

是否有关于订单的任何信息   在查询中锁定表   postgresql(没有显式锁定)?   或者可能是其他解决方案   可能的?

通常postgresql的mvcc实现可以保护你免受许多类型的死锁。有关详细信息,请参阅http://www.postgresql.org/files/developer/transactions.pdf

但是,一个常见的解决方案是只处理死锁,也就是说,如果查询因死锁而失败,请再试一次。?