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

有帮助吗?

解决方案

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

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

就你而言, master 锁定资源, slave 等待 master, , 和 master 等待用户输入,但由于连接丢失而从未收到该输入。

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

要控制连接丢失检测,您可以使用以下命令 PostgreSQL 连接选项:

tcp_keepalives_idle (integer)

在支持的系统上 TCP_KEEPIDLE 套接字选项,指定在空闲连接上发送保持活动之间的秒数。零值使用系统默认值。如果 TCP_KEEPIDLE 不支持,该参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。

tcp_keepalives_interval (integer)

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

tcp_keepalives_count (integer)

在支持的系统上 TCP_KEEPCNT 套接字选项,指定在连接被视为死亡之前可以丢失多少个保活。零值使用系统默认值。如果 TCP_KEEPCNT 不支持,该参数必须为零。对于通过 Unix 域套接字建立的连接,此参数将被忽略。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top