方案二:最終一致性
分布式事物解決方案:
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.分布式...