2015-07-10 110 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