2013-07-20 102 views
0

我有一個表Jobs與字段NameStatus休眠行鎖定讀取

我想在tomcat實例中部署兩個獨立的應用程序來輪詢作業表中的新記錄,但重要的是兩個進程不會收到相同的作業記錄。我怎樣才能做到這一點?

我的(失敗)的做法迄今一直使用Spring的集成:

<int-jdbc:inbound-channel-adapter 
    query="select * from jobs where status=1" 
    channel="rawInputDataListChannel" 
    data-source="dataSource" 
    update="update input_table set status=2 where status=1"> 
    <int:poller fixed-rate="1"> 
     <int:transactional isolation="READ_COMMITTED" /> 
    </int:poller> 
</int-jdbc:inbound-channel-adapter> 

因爲這沒有工作,我想,也許有Tomcat中的事務管理器,因此它可以通過這兩個應用程序共享可能工作,但我正在努力獲得和運行。這種方法會起作用嗎?

回答

5

您的問題的標題提到休眠,所以讓我們看看JPA 2.0提供什麼是圍繞LockMode和悲觀鎖定的想法。在您查看的情況下,您希望可能同時運行查詢,並讓每個JVM獲得一組唯一的結果。既然如此,你想模仿一個SELECT... FOR UPDATE(這是有點專有的,並且依賴於你的數據庫是否會直接支持該語句)。

在JPA 2.0你可以使用@LockMode並指定該結果集是更新的意圖獲取,所以「鎖定」在它的數據庫中,因此沒有其他連接可以得到相同的結果。

看看this這篇文章,試圖比我更好地解釋它,並特別關注'悲觀'模式。

編輯>>>

如果你正在尋找在休眠3.x中,嘗試this鏈接

+0

非常感謝您的幫助。我錯誤地認爲我在後文的SI例子中依賴於hibernate - 它只是使用數據源的SQL。我添加了「FOR UPDATE」,並且工作完美。謝謝! – James