PostgreSQL:REPEATABLE_READ事务致pg_dump阻塞,求一致性无阻塞方案
解决方法
首先明确问题根源:你的REPEATABLE_READ事务默认是读写事务,PostgreSQL中这类长时间运行的读写事务会阻塞pg_dump所需的SHARE UPDATE EXCLUSIVE锁(pg_dump用这个锁防止备份期间DDL操作破坏一致性)。而只读事务不会持有这类阻塞性锁,同时依然能保证数据一致性。
具体修改方案
在Java程序中,开启事务时除了设置隔离级别,还要显式标记事务为只读:
// 获取连接后配置事务属性 connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); connection.setReadOnly(true); // 关键:标记为只读事务 // 执行表1、表2的查询导出操作 // ... // 最后提交事务 connection.commit();
这样修改后,你的事务依然会在REPEATABLE_READ隔离级别下获取一致性快照,所有查询都基于同一个时间点的数据,不受并发修改影响;同时因为是只读事务,不会阻塞pg_dump的锁请求,pg_dump可以正常启动并完成备份。
补充说明
如果你的导出逻辑中完全没有写操作(只是查询导出),这个修改没有任何副作用。如果后续需要在同一事务中加入写操作,再去掉setReadOnly(true)即可。
你也可以直接用SQL语句配置事务属性,效果和Java代码设置一致:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY;
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

