2015-07-10 60 views
2

我没有成功获取Spring数据发送postgres FOR UPDATE与NOWAIT。弹簧数据悲观锁定超时与Postgres

我在Repository尝试这样:

@Lock(value = LockModeType.PESSIMISTIC_WRITE) 
MyObject findByUuid(String uuid); 

配置(片段)

@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()获得( “javax.persistence.lock.timeout”));

但上述只是让我“FOR UPDATE”,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); 

这确实给我一个锁定异常,但随后的春节装饰服务(代理)上抛出了一个交易/回滚异常返回,这意味着我无法给出方法的返回值,我需要。

问题: 1)如何获取Spring数据以添加NOWAIT? 2)有没有办法返回值?我怀疑我需要自己处理事务,还是改变逻辑流程?不确定Spring是否处理NOWAIT,如果它的行为不同。

我意识到存在类似的问题,但这略有不同。 我使用的是hibernate 4.2.15,spring-data-jpa 1.7.1,postgres sql 9.3。

+0

Spring Data JPA不向Postgresql发送任何东西,您的JPA提供程序会这样做。 Hibernate(你推测使用的)是否支持NOWAIT的添加? –

+0

好问题。查看我们使用的类(PostgresSQL82Dialect),它具有以下实现:getForUpdateNowaitString(...){this.getForUpdateString(...)+“nowait”; }基于应该这样做的HH-6452,是唯一要检查的东西吗? – Joel

+0

然而,方言没有被设置正确,所以它不工作,现在是。这解决了它,谢谢@NeilStockton – Joel

回答

0

use PESSIMISTIC_FORCE_INCREMENT

+1

尽管这段代码可能解决这个问题,[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于改进您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – kayess