Seata 是一款開源的分散式事務解決方案,其核心機制基於兩階段提交協定。Seata 的使用主要包括以下幾個方面:
整體機制:
一階段:業務數據和回滾日誌記錄在同一個本地事務中提交,以釋放本地鎖和連線資源。
二階段:全局事務提交是異步進行的。全局事務回滾則通過一階段的回滾日誌進行反向補償。
原理:
Seata 通過代理數據源(默認配置 `seata.enable-auto-data-source-proxy: true`),對資料庫寫操作進行攔截。當程式執行寫操作時,Seata 分析 SQL 語句,獲取相關數據行的詳細信息,並保存在本地 undo_log 表中作為日誌備份。如果出現異常,Seata Server 可以利用這些日誌進行回滾,確保分散式事務的強一致性。
寫隔離:
在一階段本地事務提交前,需要先獲得全局鎖。如果無法獲得全局鎖,則不能提交本地事務。嘗試獲取全局鎖的次數有限,超過限制將放棄,並回滾本地事務,釋放本地鎖。
讀隔離:
在資料庫本地事務隔離級別為讀已提交(Read Committed)或以上基礎上,Seata(AT 模式)的默認全局隔離級別是讀未提交(Read Uncommitted)。如果套用有特定的全局讀已提交要求,可以通過代理 `SELECT ... FOR UPDATE` 語句來實現。
AT模式:
前提是基於支持本地 ACID 事務的關係型資料庫。Java 套用通過 JDBC 訪問資料庫。AT 模式是 Seata 提供的一種事務模式,它利用了資料庫的行級鎖定和行版本控制來實現分散式事務的原子性。
通過上述機制,Seata 能夠有效地管理分散式系統中的事務,確保數據的一致性和完整性。