【发布时间】:2015-09-29 20:01:45
【问题描述】:
我无法让 Spring Data 使用 NOWAIT 向 postgres 发送 FOR UPDATE。
我已经在存储库中尝试过:
@Lock(value = LockModeType.PESSIMISTIC_WRITE)
MyObject findByUuid(String uuid);
配置(sn-p)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "docsEntityManagerFactory",
transactionManagerRef = "docsTransactionManager",
@Bean(name = "docsEntityManagerFactory")
public EntityManagerFactory docsEntityManagerFactory(DataSource docsDataSource) {
props.setProperty("javax.persistence.lock.timeout", "0");
...
我什至在我的服务中注入了 EntityManager,这会返回 0:
logger.info(em.getProperties().get("javax.persistence.lock.timeout"));
但上面的内容只让我得到“更新”,NOWAIT 部分没有被设置。我是否设置了正确的东西(从另一篇文章看来这应该可行)。
这让我更接近,虽然我不想使用原始 sql
@Lock(value = LockModeType.PESSIMISTIC_WRITE)
@Query(value = "SELECT * FROM the_table WHERE uuid = :uuid FOR UPDATE NOWAIT", nativeQuery = true)
MyObject findByUuid(@Param("uuid") String uuid);
这确实给了我一个 Lock 异常,但是 Spring 装饰的服务(代理)在返回时会抛出一个 Transaction/Rollback 异常,这意味着我不能给出我需要的方法的返回值。
问题: 1) 如何让 Spring Data 添加NOWAIT? 2)有没有办法返回值?我怀疑我需要自己处理事务,还是更改逻辑流程?不确定 Spring 是否会处理 NOWAIT,如果它的行为会有所不同。
我知道有类似的问题,但这略有不同。 我正在使用休眠 4.2.15、spring-data-jpa 1.7.1、postgres sql 9.3。
【问题讨论】:
-
Spring Data JPA 不会向 Postgresql 发送任何内容,而您的 JPA 提供程序会。 Hibernate(您可能正在使用的)是否支持添加 NOWAIT?
-
好问题。查看我们使用的类(PostgresSQL82Dialect),它具有以下实现: getForUpdateNowaitString(...) { return this.getForUpdateString(...) + " nowait "; } 基于 HH-6452 应该这样做,这是唯一要检查的事情吗?
-
但是,方言没有设置正确,所以它不起作用,现在它可以了。解决了,谢谢@NeilStockton
标签: hibernate postgresql jpa spring-data