Best Efforts 1PC 跨庫事務
一、背景介紹
分布式事務主要解決兩種事務問題,一個是跨庫事務,另一個是跨服務事務;跨庫是指在一個事務里面包含多個資料源的資料庫操作,跨服務是一個事務中包行多個不同的應用系統的服務,best efforts 1pc 主要解決的是一個應用服務中跨多個資料源的資料一致性問題,不能解決跨服務的一致性問題,跨服務的資料一致性需要通過兩階段、三階段或者其他分布式方案來保證,
二、什么是Best Efforts 1PC模式
首先事務的實作方式是通過動態代理的方式對原方法進行增強,在原方法執行前關閉自動提交,原方法執行后呼叫commit方法顯示的進行提交,詳細可以參考著文章 https://blog.csdn.net/khuangliang/article/details/108458906,
每個事務Transaction必須在指定的資料源DataSource下進行操作來獲取資料庫連接Connection,對于多個資料源的資料庫操作在一個事務中進行的時候就需要對應多個資料的Transactions,對于這些Transactions不能串行的一個一個操作完后提交,需要在資料庫操作完后統一全部提交,Best Efforts 1PC就是通過這種方式實作的,應此它只涉及到一個提交的階段,不需要額外的協調者,執行效率高,
insert() 方法是一個事務操作
insert() {
// 插入資料庫1
insertDb1(); 對應資料庫操作分解---db1[begin; insert; commit]
// 插入資料庫2
insertDb2(); 對應資料庫操作分解----db2[begin; insert; commit]
}
我們看個實體,在insert方法中涉及兩個資料庫的操作insertDb1和insertDb2,要保證insert方法的事務特性就不能在insertDb1入庫了之后,然后在insertDb2入庫這樣串行的去操作,因為如果insertDb2失敗了而insertDb1事務成功完成了那么insertDb1回滾不了,所以需要按照db1,db2[begin; insert;]—>[db2 commit, db1 commit] 這種方式去執行,打亂原有的操作順序,通過這種后面的操作先提交前面的操作后提交的方式來確保insertDb2發生例外的化能正常回滾insertDb1操作,
三、Best Efforts 1PC適用場景和優劣
Best Efforts 1PC由于只有一個commit提交階段因此執行效率高,非常適合那種分庫sharding的對性能要求高的應用場景,但是對于應用突發宕機的這種情況還是可能會出現不一致的情況,例如上例中db2 commit成功后應用宕機了,db1 commit失敗同樣會造成資料的不一致性,這種場景就需要業務系統通過一定的方式來達到資料的最終一致性,
四、實體
跨庫事務實體參考:https://blog.csdn.net/khuangliang/article/details/108632522
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/62959.html
標籤:其他
