2017-05-30 49 views
1

我有兩個不同的計劃cron作業,每15分鐘運行一次並在60秒內完成作業。在同一enity兩種行爲:看了那麼進程,然後使用JpaRepository保存方法保存entitiy並導致以下錯誤如何避免造成ObjectOptimisticLockingFailureException的兩個計劃作業的衝突

org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [nl.coin.comp.domain.ServiceProvider] with identifier [105]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [nl.coin.comp.domain.ServiceProvider#105] 

作爲修復我想避免兩個作業之間的衝突。我正在考慮對兩者使用@Scheduled(fixedelay)不同的固定延遲,但它們也可以重疊。 請幫我這個。

+0

再試一次?這就是您通常在樂觀鎖定失敗時執行的操作。 – Kayaman

+0

感謝您的答覆,但我不想重試,因爲我的應用程序將運行在不同的節點上,並具有相同的分貝,所以如果1節點的工作做的任務,我很好這個異常但在同一個應用程序實例我想避免兩個工作之間的衝突。 – Laxmikant

回答

0

嘗試使用悲觀鎖。在實體的交易中添加select for update。第二個應該等到交易1結束。

+0

感謝您的回覆。應用悲觀鎖定會阻止應用程序的其他部分讀取同一行。我正在考慮在兩個job之間使用帶有共享鎖的應用程序級同步塊。如果作業已獲得鎖,則其他人將等待。唯一的缺點是我看到兩個工作不會同時運行,並且會等待util完成。 – Laxmikant

+0

這是一個潛在的泄漏。假設你在不同的節點上運行2個作業。我還建議爲實體介紹一種狀態。開始工作後立即將其設置爲「進行中」,並讓其他作業等待,直到狀態被釋放。 – StanislavL