我沒有成功獲取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。
Spring Data JPA不向Postgresql發送任何東西,您的JPA提供程序會這樣做。 Hibernate(你推測使用的)是否支持NOWAIT的添加? –
好問題。查看我們使用的類(PostgresSQL82Dialect),它具有以下實現:getForUpdateNowaitString(...){this.getForUpdateString(...)+「nowait」; }基於應該這樣做的HH-6452,是唯一要檢查的東西嗎? – Joel
然而,方言沒有被設置正確,所以它不工作,現在是。這解決了它,謝謝@NeilStockton – Joel