And*_*ndy 1 database postgresql locking high-availability
我正在测试配置为JDBC Master/Slave的ActiveMQ系统的容错能力.在这个设置中有一个postgres数据库和两个代理 - 一个是主代理,另一个是从代理.这种机制的工作方式是master在db中的表上取出一个独占锁.从站也尝试执行此操作并等待锁定变为可用.如果主设备死机,则应释放锁定,从设备将接管.但是,如果主服务器与数据库失去网络连接,则永远不会释放锁定,从而导致死锁情况.这里似乎需要一种方法来告诉Postgres如果在指定的时间内没有续订,就会自动释放锁.POSA 3设计模式书将其称为租赁模式.是否有可能让Postgres这样做?如果没有,其他数据库供应商是否支持它?
这不是死锁,这是连接丢失的问题.
当两个事务试图锁定先前彼此锁定的资源时,会发生死锁.PostgreSQL检测到这些情况.
在您的情况下,master锁定资源,slave等待master,并master等待它从未收到的用户输入,因为连接丢失.
每当PostgreSQL检测到丢失的连接时,它会自动回滚其事务.
要控制连接丢失检测,可以使用以下PostgreSQL 连接选项:
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域套接字进行的连接,将忽略此参数.