是否有可能在PostgreSQL中自动释放锁定?

时间:2009-07-22 20:40:33

标签: database postgresql locking high-availability

我正在测试配置为JDBC Master / Slave的ActiveMQ系统的容错能力。在这个设置中有一个postgres数据库和两个代理 - 一个是主代理,另一个是从代理。这种机制的工作方式是master在db中的表上取出一个独占锁。从站也尝试执行此操作并等待锁定变为可用。如果主设备死机,则应释放锁定,从设备将接管。但是,如果主服务器与数据库失去网络连接,则永远不会释放锁定,从而导致死锁情况。这里似乎需要一种方法来告诉Postgres如果在指定的时间内没有更新,就会自动释放锁。 POSA 3设计模式书将其称为租赁模式。是否有可能让Postgres这样做?如果没有,其他数据库供应商是否支持它?

1 个答案:

答案 0 :(得分:5)

这不是死锁,这是连接丢失的问题。

当两个事务试图锁定先前彼此锁定的资源时,会发生死锁。 PostgreSQL检测到这些情况。

在您的情况下,master锁定资源,slave等待mastermaster等待由于连接丢失而从未收到的用户输入。

每当PostgreSQL检测到丢失的连接时,它会自动回滚其事务。

要控制连接丢失检测,您可以使用以下PostgreSQL connection options

  

tcp_keepalives_idle (integer)

     

在支持TCP_KEEPIDLE套接字选项的系统上,指定在其他空闲连接上发送Keepalive之间的秒数。值为零使用系统默认值。如果不支持TCP_KEEPIDLE,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。

     

tcp_keepalives_interval (integer)

     

在支持TCP_KEEPINTVL套接字选项的系统上,指定在重新传输之前等待keepalive响应的时间(以秒为单位)。值为零使用系统默认值。如果不支持TCP_KEEPINTVL,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。

     

tcp_keepalives_count (integer)

     

在支持TCP_KEEPCNT套接字选项的系统上,指定在连接被视为死亡之前可能丢失的Keepalive数量。值为零使用系统默认值。如果不支持TCP_KEEPCNT,则此参数必须为零。对于通过Unix域套接字进行的连接,将忽略此参数。