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

Spring transactions and postgres (VACUUM, run outside transaction)

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

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

有两种解决方法。

最好的方法是永远不要调用 VACUUM,而是适当地将 AUTOVACUUM 调整为 运行。

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