PostgreSQL 是否可以自动释放锁?
-
19-09-2019 - |
题
我正在测试配置为 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 域套接字建立的连接,此参数将被忽略。