我將嘗試描述我試圖解決的問題。我意識到我開發的一個應用程序執行的Spring事務管理很差。我在DAO接口方法(CRUD)上定義的事務使用聲明式方法,而不是服務層方法。這是一個web應用程序,它執行某種消息處理,並且多個線程同時在相同的消息實例上運行。以下是典型序列中的步驟:關於春季交易管理的建議重新設計
- 消息在T1(事務1)中創建並放入出站隊列。 T1終止。
- 消息由隊列中的不同線程獲取,隨着發送時間和一些其他信息發送和更新。消息對象的屬性被設置並調用dao.update(m),t2開始。
- 在t2提交之前,收到傳送報告,並且Tread3通過在db中找到它(在步驟1中保存),更新其狀態屬性並調用dao.upate(m)來開始處理相同的消息對象,以便t3在t2仍然進行中。
- 另一個線程(線程4)通過在t4中再次更改它的狀態來進一步處理相同的消息對象。
不時發生的結果是從t2開始的更改丟失,發送時間在db中爲空。 我需要幫助確定如何改進應用程序設計,並通過防止同時處理相同的消息來消除此問題。
我應該集中精力重新設計交易(使用它的服務水平,而不是DAO),並使用序列化隔離級別(或其他方式)或
我應該使用JPA實體管理器鎖定?
應用程序使用spring 3和JPA2與hibernate實現。
郵件是如何發送的? JMS?網絡服務?其他?你可以讓全局分佈式事務的這部分(在JMS的情況下)?如果不是,那麼您是不是應該在T2完成後簡單地發送消息,並且確保在收到傳送報告時T2已經結束? –
消息通過第三方Web服務發送。 T2在發送消息之前無法執行,因爲消息會隨着發送結果而更新。 – makcro