??????當使用多個資源合作解決一個問題的時候,必須使這些資源在一個事務中進行合作。為了實現(xiàn)這一目的,將事務分為兩個階段進行:
??????第一階段開始時,向此事務涉及到的全部資源發(fā)送提交前信息。此時,事務涉及到的資源還有最后一次機會來回滾事務。如果任意一個資源決定回滾事務,那么整個事務將被取消。否則,事務會被提交。
第二階段只是在第一階段沒有回滾時才會發(fā)生。在這個階段,所有的能被定位和單獨控制的資源都將真正的更新。
??????事務被分割成兩個階段來完成,這被稱為兩階段提交協(xié)議。如果程序在同一個操作中需要訪問多種資源,您就要使用兩階段提交事務。例如,如果從 JMS 隊列中刪除一個消息,并且隨后更新數(shù)據(jù)庫中基于這條消息的紀錄,這時,要保證這兩個操作的原子性。不應該出現(xiàn)一條消息已經(jīng)從隊列中被刪除,而系統(tǒng)沒有更新與此消息相關的數(shù)據(jù)庫中的紀錄的情況。可以通過應用程序的代碼在數(shù)據(jù)庫更新失敗的時候 "撤銷"對隊列的操作。但是這樣做并不還,因為當程序在執(zhí)行“撤銷”操作的過程中服務器突然崩潰的話就會導致數(shù)據(jù)出現(xiàn)不一致。作為替代的方式,應該使用兩階段提交事務。
??????第一階段開始時,向此事務涉及到的全部資源發(fā)送提交前信息。此時,事務涉及到的資源還有最后一次機會來回滾事務。如果任意一個資源決定回滾事務,那么整個事務將被取消。否則,事務會被提交。
第二階段只是在第一階段沒有回滾時才會發(fā)生。在這個階段,所有的能被定位和單獨控制的資源都將真正的更新。
??????事務被分割成兩個階段來完成,這被稱為兩階段提交協(xié)議。如果程序在同一個操作中需要訪問多種資源,您就要使用兩階段提交事務。例如,如果從 JMS 隊列中刪除一個消息,并且隨后更新數(shù)據(jù)庫中基于這條消息的紀錄,這時,要保證這兩個操作的原子性。不應該出現(xiàn)一條消息已經(jīng)從隊列中被刪除,而系統(tǒng)沒有更新與此消息相關的數(shù)據(jù)庫中的紀錄的情況。可以通過應用程序的代碼在數(shù)據(jù)庫更新失敗的時候 "撤銷"對隊列的操作。但是這樣做并不還,因為當程序在執(zhí)行“撤銷”操作的過程中服務器突然崩潰的話就會導致數(shù)據(jù)出現(xiàn)不一致。作為替代的方式,應該使用兩階段提交事務。