新聞中心
Sharding-JDBC目前還整合其他分布式事務(wù)模式來解決事務(wù)問題,今天就來介紹一下兩階段事務(wù)XA是如何解決分布式事務(wù)

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出阿克蘇免費(fèi)做網(wǎng)站回饋大家。
什么是XA規(guī)范
XA 規(guī)范 是 X/Open 組織定義的分布式事務(wù)處理(DTP,Distributed Transaction Processing)標(biāo)準(zhǔn)。
XA 規(guī)范描述了全局的事務(wù)管理器與局部的資源管理器之間的接口。XA規(guī)范的目的是允許多個資源(如數(shù)據(jù)庫,應(yīng)用服務(wù)器,消息隊(duì)列等)在同一事務(wù)中訪問,這樣可以使 ACID 屬性跨越應(yīng)用程序而保持有效。
XA 規(guī)范使用兩階段提交來保證所有資源同時提交或回滾任何特定的事務(wù)。
XA 事務(wù)的基礎(chǔ)是兩階段提交協(xié)議。需要有一個事務(wù)協(xié)調(diào)者來保證所有的事務(wù)參與者都完成了準(zhǔn)備工作(第一階段)。如果協(xié)調(diào)者收到所有參與者都準(zhǔn)備好的消息,就會通知所有的事務(wù)都可以提交了(第二階段)。
MySQL 在這個 XA 事務(wù)中扮演的是參與者的角色,而不是協(xié)調(diào)者(事務(wù)管理器)。
MySQL中的XA事務(wù)分為外部XA和內(nèi)部XA:
- 外部XA:可以參與外部的分布式事務(wù),需要協(xié)調(diào)者參與協(xié)調(diào)
- 內(nèi)部XA:用于同一實(shí)例下跨多引擎事務(wù),由 Binlog 作為協(xié)調(diào)者,比如在一個存儲引擎提交時,需要將提交信息寫入二進(jìn)制日志,這就是一個分布式內(nèi)部 XA 事務(wù),只不過二進(jìn)制日志的參與者是 MySQL 本身。
基于XA規(guī)范分布式事務(wù)對業(yè)務(wù)是無侵入的,用戶可以像使用本地事務(wù)一樣使用基于XA規(guī)范的分布式事務(wù)。
但是基于XA規(guī)范的分布式事務(wù)屬于強(qiáng)一致性事務(wù),性能比較低,尤其在長事務(wù)的情況下,對資源的鎖定時間較長,一般適用于短事務(wù)、低并發(fā)的場景。
MySQL中XA事務(wù)
接下來就以為MySQL中XA來演示一下,如下;
上述命令什么意思呢?解析如下:
- XA START "test_xid"?:開啟一個XA事務(wù),test_xid是全局事務(wù)xid,名稱任意
- update product_base set price=1000 where product_id=743948772064624640:執(zhí)行的SQL語句
- XA END "test_xid"?:這個表示結(jié)束一個 XA 事務(wù),此時事務(wù)的狀態(tài)轉(zhuǎn)為IDLE。
- XA PREPARE "test_xid":這個將事務(wù)置為 PREPARE 狀態(tài)
- XA COMMIT "test_xid":這個用來提交事務(wù),提交之后,事務(wù)的狀態(tài)就是 COMMITED。
- XA ROLLBACK "test_xid":這個用來回滾事務(wù)
Sharding-JDBC中的XA事務(wù)
Sharding-JDBC目前已經(jīng)整合了XA事務(wù)的支持,支持的Atomikos、NARAYANA 、BITRONIX 事務(wù)的實(shí)現(xiàn),默認(rèn)的實(shí)現(xiàn)是Atomikos。下面將以Atomikos為例子介紹一下Sharding-JDBC如何實(shí)現(xiàn)XA事務(wù)
SharingSphere是通過SPI的方式去定制分布式事務(wù)解決方案的,XA的默認(rèn)實(shí)現(xiàn)是org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager,有興趣的可以看下其中源碼
后文介紹到的弱一致性事務(wù)使用Seata的AT模式,對應(yīng)的是org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingTransactionManager
當(dāng)然Seata也是支持XA事務(wù),如果后續(xù)改寫的話,可以通過SPI的方式的定制
1. 添加依賴
使用XA事務(wù)需要添加一個依賴,如下:
org.apache.shardingsphere
sharding-transaction-xa-core
可以看到這個依賴中內(nèi)置了ATOMIKOS,如下:
2. 配置事務(wù)管理器
使用事務(wù)之前當(dāng)然需要配置一個事務(wù)管理器,這里和Spring Boot 中配置沒差別,如下:
@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager txManager(final DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
3. @ShardingTransactionType注解
想要開啟XA分布式事務(wù)還需要使用一個注解@ShardingTransactionType,其中的value屬性的值如下:
- TransactionType.LOCAL:開啟本地事務(wù)的支持,默認(rèn)值
- TransactionType.XA:開啟XA事務(wù)的支持
- TransactionType.BASE:開啟弱事務(wù)的支持
那么顯然這里只需要配置TransactionType.XA就能開啟XA事務(wù)的支持
偽代碼如下:
@ShardingTransactionType(value = TransactionType.XA)
@Transactional
public void method(){
//跨庫操作
..............
}
4. 啟動測試
演示的源碼請看視頻教程中的源碼,需要注意的是Atomikos會在項(xiàng)目的logs目錄下生成xa_tx.log文件,其中記錄了事務(wù)日志,在XA崩潰恢復(fù)時所需要的日志,一定不要刪除
對于Atomikos的一些配置可以通過在項(xiàng)目的classpath中添加jta.properties來定制化Atomikos配置項(xiàng),這里就不再給大家詳細(xì)介紹了。
網(wǎng)站題目:一個注解搞定分布式事務(wù)
網(wǎng)頁路徑:http://www.dlmjj.cn/article/ccdeeji.html


咨詢
建站咨詢
