【问题标题】:Spring transactions and postgres (VACUUM, run outside transaction)Spring 事务和 postgres(VACUUM,在事务外部运行)
【发布时间】: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 的运作方式。

标签: postgresql spring-boot hikaricp


【解决方案1】:

对此有两种解决方案。

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

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

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2021-10-15
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多