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,在事务外部运行)的主要内容,如果未能解决你的问题,请参考以下文章