事務例子 分布式事務一些心得

2021-10-16 01:11:54 字數 3799 閱讀 8605

答:事務。

舉個例子

使用者下了乙個訂單,需要修改餘額表,訂單表,流水表,於是會有類似的偽**:

start transaction;

curd table t_account; any exception rollback;

curd table t_order; any exception rollback;

curd table t_flow; any exception rollback;

commit;

事務,可保證資料的完整性以及一致性。

多庫環境下,事務的方案會有什麼潛在問題?

:網際網路的業務特點,資料量較大,併發量較大,經常使用拆庫的方式提公升系統的效能。

如果進行了拆庫,餘額、訂單、流水可能分布在不同的資料庫上,甚至不同的資料庫例項上,此時就不能用資料庫原生事務來保證資料的一致性了。

答:補償事務是一種常見的實踐。

什麼是補償事務?

答:補償事務,是一種在業務端實施業務逆向操作事務。

舉個栗子:

修改餘額事務為:

int do_accountt(uid, money){

start transaction;

//餘額改變money這麼多

curd table t_account with money for uid;

anyexception rollback return no;

commit;

return yes;

那麼,修改餘額補償事務可以是:

int compensate_accountt(uid, money){

//做乙個money的反向操作

return do_accountt(uid, -1*money){

同理,訂單操作事務是:do_ordert,新增乙個訂單;

訂單操作補償事務是:compensate_ordert,刪除乙個訂單。

要保證餘額與訂單的一致性,偽**:

// 執行第乙個事務

int flag = do_accountt();

if(flag=yes){

//第乙個事務成功,則執行第二個事務

flag= do_ordert();

if(flag=yes){

// 第二個事務成功,則成功

return yes;

else{

// 第二個事務失敗,執行第乙個事務的補償事務

compensate_accountt();

補償事務有什麼缺點?

畫外音:上面的例子還只考慮了餘額+訂單的一致性,就有2*2=4個分支,如果要考慮餘額+訂單+流水的一致性,則會有2*2*2=8個if/else分支,複雜性呈指數級增長。

答:多個資料庫例項上的多個事務,要保證一致性,可以進行「後置提交優化」。

單庫是用這樣乙個大事務保證一致性:

start transaction;

curd table t_account; any exception rollback;

curd table t_order; any exception rollback;

curd table t_flow; any exception rollback;

commit;

拆分成了多個庫後,大事務會變成三個小事務:

start transaction1;

//第乙個庫事務執行

curd table t_account; any exception rollback;

// 第乙個庫事務提交

commit1;

start transaction2;

//第二個庫事務執行

curd table t_order; any exception rollback;

// 第二個庫事務提交

commit2;

start transaction3;

//第三個庫事務執行

curd table t_flow; any exception rollback;

// 第三個庫事務提交

commit3;

乙個事務,分成執行提交兩個階段:

於是整個執行過程的時間軸如下:

第乙個事務執行200ms,提交1ms;

第二個事務執行120ms,提交1ms;

第三個事務執行80ms,提交1ms;

在什麼時候,會出現不一致?

:第乙個事務成功提交之後,最後乙個事務成功提交之前,如果出現問題(例如伺服器重啟,資料庫異常等),都可能導致資料不一致。

畫外音:如上圖,最後202ms內出現異常,會出現不一致。

什麼是後置提交優化?

:如果改變事務執行與提交的時序,變成事務先執行,最後一起提交。

第乙個事務執行200ms,第二個事務執行120ms,第三個事務執行80ms;

第乙個事務提交1ms,第二個事務提交1ms,第三個事務提交1ms;

後置提交優化後,在什麼時候,會出現不一致?

:問題的答案與之前相同,第乙個事務成功提交之後,最後乙個事務成功提交之前,如果出現問題(例如伺服器重啟,資料庫異常等),都可能導致資料不一致。

畫外音:如上圖,最後2ms內出現異常,會出現不一致。

有什麼區別和差異?

雖然沒有徹底解決資料的一致性問題,但不一致出現的概率大大降低了。

畫外音:上面這個例子,概率降低了100倍。

後置提交優化,有什麼不足?

:對事務吞吐量會有影響:

這就意味著,資料庫連線占用的時間增長了,系統整體的吞吐量降低了。

分布式事務,兩種常見的實踐:

把trx1.exec(); trx1.commit();

trx2.exec(); trx2.commit();

trx3.exec(); trx3.commit();

優化為:

trx1.exec(); trx2.exec(); trx3.exec();

trx1.commit(); trx2.commit(); trx3.commit();

這個小小的改動(改動成本極低),不能徹底解決多庫分布式事務資料一致性問題,但能大大降低資料不一致的概率,犧牲的是吞吐量。

事務 分布式事務

事務 邏輯上的一組操作,要麼都成功要麼都失敗 事務的四個特性 acid 原子性,一致性,隔離性,永續性 事務的隔離級別 讀未提交 產生髒讀 讀已提交 不可重複讀 可重複讀 幻讀 mysql預設 序列化讀 效能最低 傳播行為 7個 七種傳播行為 required 支援當前事務,如果不存在,就新建乙個 ...

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

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

分布式 分布式事務

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