2016-01-15 12 views
0

當我創建一個新對象'Order'後,我想獲得它的生成ID並放到AMQP隊列中,以便工作人員可以用它來做其他事情。工作人員接受生成的ID(消息)並查找訂單,但抱怨沒有記錄存在,即使我剛剛創建了一個記錄。我試圖找出在將消息(生成的ID)放入隊列(我認爲這不是一個好主意)之前調用我的.persist()之後等待多久。有工人循環一遍又一遍,直到MySQL返回一個記錄(我不喜歡任何一個);或者在知道數據在mysql中安全後,找到可以將消息放入隊列的點(這聽起來最好)。我認爲它需要在任何@Transactional方法之外完成。在什麼時候我可以相信數據已經保存到mysql?

將要從mysql讀取數據的工作人員是不同服務器上不同系統的一部分。那麼,我什麼時候可以告訴工作人員數據是在mysql中,以便它可以開始執行其任務?

在@Transactional方法完成數據完成寫入mysql之後,我確實無法理解這一點。 感謝萬先進。

+0

數據庫事務是一個相當廣泛的主題,但是您需要確保在您嘗試從另一個事務中讀取數據之前寫入數據的事務已完成。當然,除非您的事務隔離是'READ_UNCOMMITTED',但我們不要深入瞭解。 – Kayaman

+0

一旦你提交了這個事務,你的所有操作都將被保證持久化,並且對於運行它們自己的事務的其他進程是可見的。除非您使用READ_UNCOMMITTED作爲事務隔離級別。 – Ralf

+0

我的問題更多地是指從隊列中挑選訂單ID的工作人員完全是另一個系統的一部分 - 抱歉,我忘記提及我的問題。不適當更新。 – Dagron

回答

0

是不是真的@Transactional方法完成後數據是 完成寫入mysql,我無法理解這一點。 感謝萬先進。

因此,首先,作爲Kayamann和拉爾夫在評論中寫道,它保證了數據存儲並可供其他進程事務提交時(結束)

@Transactional方法很容易理解。如果有@Transactional方法,則表示容器(實際將調用該方法的應用程序)將在方法調用之前開始事務,並在成功或錯誤時自動提交或回滾事務。

因此,如果我們有

@Transactional 
public void modify(){ 
    doSomething(); 
} 

而當你在代碼中調用某個地方(或通過contaier例如,由於一些綁定invokation)的實際工作frol將如下

tx=entityManager.beginTransaction(); 
object.modify(); 
tx.commit(); 

有非常簡單。這種方法將意味着交易是Container Controlled

作爲四個您的情況,以及讓您的外部系統知道交易已完成,您必須使用消息隊列(您已使用)與消息交易是完成一些id,它可以開始處理東西,或者使用不同的技術,例如REST。

遠程系統可以通過隊列和REST服務向每個人發送各種事件的信號,所以沒有什麼區別。

相關問題