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
.
当 运行 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
.