我正在测试配置为 JDBC Master/Slave 的 ActiveMQ 系统的容错性。在这个设置中,有一个 postgres 数据库和两个代理——一个是主代理,另一个是从代理。这种机制的工作方式是master在db中的一个表上取出一个排他锁。从站也尝试这样做并等待直到锁可用。如果 master 死了,锁应该被释放,slave 将接管。但是,如果 master 失去与数据库的网络连接,则永远不会释放锁,从而导致死锁情况。这里似乎需要一种方法来告诉 Postgres 如果在指定的时间段内没有更新,则自动释放锁。POSA 3 设计模式书将其称为租赁模式。是否有可能让 Postgres 做到这一点?如果不,
1 回答
这不是死锁,这是失去连接的问题。
当两个事务试图锁定以前彼此锁定的资源时,就会发生死锁。PostgreSQL
检测这些情况。
在您的情况下,master
锁定资源,slave
等待master
,并master
等待由于连接丢失而从未收到的用户输入。
每当PostgreSQL
检测到丢失的连接时,它都会自动回滚其事务。
要控制连接丢失检测,您可以使用以下PostgreSQL
连接选项:
tcp_keepalives_idle (integer)
在支持
TCP_KEEPIDLE
套接字选项的系统上,指定在其他空闲连接上发送保活之间的秒数。零值使用系统默认值。如果TCP_KEEPIDLE
不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。
tcp_keepalives_interval (integer)
在支持
TCP_KEEPINTVL
socket 选项的系统上,指定在重新传输之前等待对 keepalive 的响应的时间(以秒为单位)。零值使用系统默认值。如果TCP_KEEPINTVL
不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。
tcp_keepalives_count (integer)
在支持
TCP_KEEPCNT
socket 选项的系统上,指定在连接被认为死之前可能会丢失多少个 keepalive。零值使用系统默认值。如果TCP_KEEPCNT
不支持,则此参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。