Spring 事务和 postgres(VACUUM,在事务外部运行)

Posted

技术标签:

【中文标题】Spring 事务和 postgres(VACUUM,在事务外部运行)【英文标题】:Spring transactions and postgres (VACUUM, run outside transaction) 【发布时间】:2021-07-28 17:41:36 【问题描述】:

在运行 postgres 查询 VACUUM ANALYZE my_table; 时,我总是在使用 HikariCP 的 spring boot 中遇到同样的错误。

Caused by: org.postgresql.util.PSQLException: ERROR: VACUUM cannot run inside a transaction block

据我了解,它应该适用于 @Propagation.NEVER,但我无法让它工作。

/**
* Execute non-transactionally, throw an exception if a transaction exists.
* Analogous to EJB transaction attribute of the same name.
*/
NEVER(TransactionDefinition.PROPAGATION_NEVER),

如果我将 hikari 设置为 auto-commit: true 它可以工作,但我不想这样做。

如何在不打开auto-commit 的情况下实现运行VACUUM

【问题讨论】:

自动提交有什么问题?如果您需要,只需开始交易。这就是 PostgreSQL 的运作方式。 【参考方案1】:

对此有两种解决方案。

最好的办法是永远不要调用VACUUM,而是调整AUTOVACUUM 以使其正常运行。

第二种解决方案是在使用 PostgreSQL 时使用auto-commit,但请确保在需要时使用事务范围。在 java 和 spring 的情况下,将使用注解 @Transactional

【讨论】:

以上是关于Spring 事务和 postgres(VACUUM,在事务外部运行)的主要内容,如果未能解决你的问题,请参考以下文章

postgres WAL归档

postgres WAL归档

从 Spring Boot 1.5 升级到 2.0 - 无法在只读事务中执行 UPDATE

事务中的 Postgres 锁

node.js + postgres 数据库事务管理

没有可序列化事务的 Postgres 序列化错误