Spring的分布式事務,使用或不用XA 8

2021-06-13 05:55:35 字數 2127 閱讀 8204

非事務性訪問模式在乙個特殊的業務邏輯下才有意義。想法是有些時候你需要訪問的是臨界資源(一次只允許乙個程序訪問),所以根本不需要處於乙個事務中。

例如,您可能需要在乙個審計表中插入一行資料,不管交易成功或不成功,它只是記錄這次嘗試。更一般的,人們高估了某資源讀寫變化的頻率,而且往往唯讀訪問就夠了。或者,寫操作可以被小心控制,這樣,如果有任何差錯,可以被計入或忽視。

在這些情況下,處於事務之外的資源可能也有自己的事務,只不過不和資源同步。如果您使用的是spring,主事務由platformtransactionmanager所驅動,臨界資源可能是不受事務管理器控制的乙個資料庫連線。每次臨界資源的訪問具有autocommit=true的預設設定。讀操作不會看到在同時發生的另乙個未提交的事務中的更新(假設合理的預設隔離級別),但是寫操作的影響通常會被其他參與者立即看到。

這種模式在設計業務流程中需要更仔細的分析和更多的自信,但這和最大努力1pc模式並無太大不同。乙個提供補償事務的通用服務對於大多數專案而言過於雄心勃勃。但包含冪等服務以及只執行乙個寫操作(可能有多個讀操作)的案例並不少見。這些是使用非事務性訪問模式的理想場合。

wing-and-a-prayer代表的是困境中靠祈禱為生,實際上是一種反模式(antipattern)。

它往往發生在開發人員不了解分布式事務或沒有意識到這一點的時候。不通過顯式呼叫底層資源的事務交易api,你不能想當然認為所有資源將加入乙個事務。如果你使用的是spring事務管理器而不是jtatransactionmanager,會有乙個事務資源和它關聯。事務管理器就是其中使用sping宣告的事務管理功能比如@transactional來解釋方法執行的那個。 沒有其他資源可以在同一事務中登記。通常的結果是,運氣好一切正常,但只要有乙個異常,使用者就會發現有資源沒有被回滾。乙個典型的導致這個問題的錯誤是,使用datasourcetransactionmanager和hibernate實現的乙個倉庫。

我會歸納出各個模式的利弊,幫助你了解如何抉擇。第一步是認識到你的系統需要分布式事務。乙個必要(但不是充分)的條件是有乙個包含多個事務性資源的過程。充分條件是,這些資源被使用在單個的用例中,通常由架構中服務層的乙個呼叫所驅動。

如果你還沒有意識到分布式事務,你有可能實現了wing-and-a-prayer模式。遲早你會看到資料應該被回滾但其實不然。也許當你發現它時, 實際上問題現象和源頭已經間隔很遠,很難追溯。該wing-and-a-prayer模式也可能是在不經意間被開發人員所採用,因為他們本以為受到xa協議的保護,但卻還沒有配置底層資源加入事務。我曾做過乙個專案,資料庫已經被另一工作組安裝,並且他們在安裝過程中關閉了xa支援。剛開始幾個月一切都很好,然後奇怪的失敗開始蔓延到業務流程中, 花了很長時間來診斷這個問題。

如果您的應用場景中混合資源的使用情況足夠簡單,你可以負擔得起這樣的分析成本及一些重構,那麼非事務性資源模式可能是一種選擇。當資源之一主要負責資料讀取,而寫操作被監控以防止重複,使用該模式是最為合適的。在非事務性資源中存放的資料必須是即使存在故障也具有商業意義的。審計,版本,和日誌資訊通常符合這個類別。故障是比較常見的,但你可以相信,不會有***。

最大努力1pc模式(best efforts 1pc)用於那些需要更多故障保護,但不希望承擔2pc開銷的系統。這種方式可以顯著改善系統效能。它比建立非事務性資源模式更棘手,但它不需要太多的分析,並且被用於更通用的資料型別。對資料一致性的完全確定要求業務處理對於「外部」資源是冪等的(任何不是首次的提交)。訊息驅動的資料庫更新是乙個完美的例子,已經在spring中得到了很好的支援。更不尋常的情況下需要一些額外的框架**(最終可能會實現為spring的一部分)。

共享資源(shared resource)模式在某些特殊情況下是完美的,通常涉及兩個特定型別和平台的資源(如 activemq與任何rdbma或oracle aq與oracle資料庫)。好處是非常好的魯棒性和出色的效能。

示例**更新

隨著spring新版本和其它的元件被發布,本文提供的示例**sample code將不可避免地有些過時。請到spring社群**spring community site訪問作者的最新的**,以及當前版本的spring框架和相關元件。

by iefreer

分布式事務使用方法

使用 ole db 開放式資料庫連線 odbc activex 資料物件 ado 或 db 庫編寫的應用程式可以使用 transact sql 分布式事務,方法是發出 transact sql 語句來啟動和停止 transact sql 分布式事務。ole db 和 odbc 還包含在應用程式程式設...

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...

分布式事務 分布式事務的實現

如果在多個服務中需要對不同的資料庫進行操作。因為不同服務操作的資料庫都不同,所以保證在同乙個事務中完成操作顯然是不科學的。那實現分布式事務的思想 1 方法入口,建立一條日誌記錄,狀態定義為初始狀態,即儲存本條日誌記錄 可以儲存在資料庫中,也可以寫出到本地磁碟檔案 2 可以在非同步執行緒或在定時任務中...