SpringBoot 分布式事務

2021-09-14 08:20:01 字數 3679 閱讀 4430

方案二:最終一致性

分布式事物解決方案:

1、兩段提交協議(2pc)- jta

2、事務補償(tcc)

3、訊息佇列實現最終一致性

為解決分布式系統的資料一致性問題出現了兩階段提交協議(2 phase commitment protocol),兩階段提交由協調者和參與者組成,共經過兩個階段和三個操作,部分關聯式資料庫如oracle、mysql支援兩階段提交協議。

2pc的優點:實現強一致性,部分關聯式資料庫支援(oracle、mysql等)。

缺點:整個事務的執行需要由協調者在多個節點之間去協調,增加了事務的執行時間,效能低下。解決方案有:springboot+atomikos or bitronix

org.springframework.boot

spring-boot-starter-jta-atomikos

# mysql 1

mysql.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useunicode=true&characterencoding=utf-8

mysql.datasource.test1.username = root

mysql.datasource.test1.password = 123456

mysql.datasource.test1.minpoolsize = 3

mysql.datasource.test1.maxpoolsize = 25

mysql.datasource.test1.maxlifetime = 20000

mysql.datasource.test1.borrowconnectiontimeout = 30

mysql.datasource.test1.logintimeout = 30

mysql.datasource.test1.maintenanceinterval = 60

mysql.datasource.test1.maxidletime = 60

# mysql 2

mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8

mysql.datasource.test2.username =root

mysql.datasource.test2.password =123456

mysql.datasource.test2.minpoolsize = 3

mysql.datasource.test2.maxpoolsize = 25

mysql.datasource.test2.maxlifetime = 20000

mysql.datasource.test2.borrowconnectiontimeout = 30

mysql.datasource.test2.logintimeout = 30

mysql.datasource.test2.maintenanceinterval = 60

mysql.datasource.test2.maxidletime = 60

@data

/** * @author administrator

*/public class dbconfig1

@data

/** * @author administrator

*/public class dbconfig2

@configuration

// basepackages 最好分開配置 如果放在同乙個資料夾可能會報錯

public class mybatisconfig1

@bean(name = "testsqlsessionfactory")

public sqlsessionfactory testsqlsessionfactory(@qualifier("testdatasource") datasource datasource)

throws exception

@bean(name = "testsqlsessiontemplate")

public sqlsessiontemplate testsqlsessiontemplate(

@qualifier("testsqlsessionfactory") sqlsessionfactory sqlsessionfactory) throws exception

}@configuration

public class mybatisconfig2

@bean(name = "test2sqlsessionfactory")

public sqlsessionfactory testsqlsessionfactory(@qualifier("test2datasource") datasource datasource)

throws exception

@bean(name = "test2sqlsessiontemplate")

public sqlsessiontemplate testsqlsessiontemplate(

@qualifier("test2sqlsessionfactory") sqlsessionfactory sqlsessionfactory) throws exception

}

新增配置註解掃瞄

1、mybatis

@enableconfigurationproperties(value=)
2、jpa

@enablejparepositories(basepackages =)

@entityscan("cn.mywork.entity")

@enableconfigurationproperties(value=)

@service

public class manyservice1

// 開啟事務,由於使用jta+atomikos解決分布式事務,所以此處不必再指定事務

@transactional

public int insertdb1anddb2(string name, integer age)

}

1、訂單服務和庫存服務完成檢查和預留資源。

2、訂單服務在本地事務中完成新增訂單表記錄和新增「減少庫存任務訊息」。

3、由定時任務根據訊息表的記錄傳送給mq通知庫存服務執行減庫存操作。

4、庫存服務執行減少庫存,並且記錄執行訊息狀態(為避免重複執行訊息,在執行減庫存之前查詢是否執行過此訊息)。

5、庫存服務向mq傳送完成減少庫存的訊息。

6、訂單服務接收到完成庫存減少的訊息後刪除原來新增的「減少庫存任務訊息」。

實現最終事務一致要求:預留資源成功理論上要求正式執行成功,如果執行失敗會進行重試,要求業務執行方法實現冪等。

優點 :

由mq按非同步的方式協調完成事務,效能較高。

不用實現try/confirm/cancel介面,開發成本比tcc低。

缺點:此方式基於關聯式資料庫本地事務來實現,會出現頻繁讀寫資料庫記錄,浪費資料庫資源,另外對於高併發操作不是最佳方案。

訊息佇列、定時任務

分布式 分布式事務

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

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

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

分布式之分布式事務

被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...