自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)注解搞定分布式事務(wù)

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
XA 規(guī)范描述了全局的事務(wù)管理器與局部的資源管理器之間的接口。XA規(guī)范的目的是允許多個(gè)資源(如數(shù)據(jù)庫(kù),應(yīng)用服務(wù)器,消息隊(duì)列等)在同一事務(wù)中訪問(wèn),這樣可以使 ACID 屬性跨越應(yīng)用程序而保持有效。

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

什么是XA規(guī)范

XA 規(guī)范 是 X/Open 組織定義的分布式事務(wù)處理(DTP,Distributed Transaction Processing)標(biāo)準(zhǔn)。

XA 規(guī)范描述了全局的事務(wù)管理器與局部的資源管理器之間的接口。XA規(guī)范的目的是允許多個(gè)資源(如數(shù)據(jù)庫(kù),應(yīng)用服務(wù)器,消息隊(duì)列等)在同一事務(wù)中訪問(wèn),這樣可以使 ACID 屬性跨越應(yīng)用程序而保持有效。

XA 規(guī)范使用兩階段提交來(lái)保證所有資源同時(shí)提交或回滾任何特定的事務(wù)。

XA 事務(wù)的基礎(chǔ)是兩階段提交協(xié)議。需要有一個(gè)事務(wù)協(xié)調(diào)者來(lái)保證所有的事務(wù)參與者都完成了準(zhǔn)備工作(第一階段)。如果協(xié)調(diào)者收到所有參與者都準(zhǔn)備好的消息,就會(huì)通知所有的事務(wù)都可以提交了(第二階段)。

MySQL 在這個(gè) 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)者,比如在一個(gè)存儲(chǔ)引擎提交時(shí),需要將提交信息寫(xiě)入二進(jìn)制日志,這就是一個(gè)分布式內(nèi)部 XA 事務(wù),只不過(guò)二進(jìn)制日志的參與者是 MySQL 本身。

基于XA規(guī)范分布式事務(wù)對(duì)業(yè)務(wù)是無(wú)侵入的,用戶可以像使用本地事務(wù)一樣使用基于XA規(guī)范的分布式事務(wù)。

但是基于XA規(guī)范的分布式事務(wù)屬于強(qiáng)一致性事務(wù),性能比較低,尤其在長(zhǎng)事務(wù)的情況下,對(duì)資源的鎖定時(shí)間較長(zhǎng),一般適用于短事務(wù)、低并發(fā)的場(chǎng)景。

MySQL中XA事務(wù)

接下來(lái)就以為MySQL中XA來(lái)演示一下,如下;

圖片

上述命令什么意思呢?解析如下:

  • XA START "test_xid"?:開(kāi)啟一個(gè)XA事務(wù),test_xid是全局事務(wù)xid,名稱(chēng)任意
  • update product_base set price=1000 where product_id=743948772064624640:執(zhí)行的SQL語(yǔ)句
  • XA END "test_xid"?:這個(gè)表示結(jié)束一個(gè) XA 事務(wù),此時(shí)事務(wù)的狀態(tài)轉(zhuǎn)為IDLE。
  • XA PREPARE "test_xid":這個(gè)將事務(wù)置為 PREPARE 狀態(tài)
  • XA COMMIT "test_xid":這個(gè)用來(lái)提交事務(wù),提交之后,事務(wù)的狀態(tài)就是 COMMITED。
  • XA ROLLBACK "test_xid":這個(gè)用來(lái)回滾事務(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是通過(guò)SPI的方式去定制分布式事務(wù)解決方案的,XA的默認(rèn)實(shí)現(xiàn)是org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager,有興趣的可以看下其中源碼

后文介紹到的弱一致性事務(wù)使用Seata的AT模式,對(duì)應(yīng)的是org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingTransactionManager

當(dāng)然Seata也是支持XA事務(wù),如果后續(xù)改寫(xiě)的話,可以通過(guò)SPI的方式的定制

1. 添加依賴(lài)

使用XA事務(wù)需要添加一個(gè)依賴(lài),如下:

<!-- 使用XA事務(wù)時(shí),需要引入此模塊 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-transaction-xa-core</artifactId>
</dependency>

可以看到這個(gè)依賴(lài)中內(nèi)置了ATOMIKOS,如下:

圖片

2. 配置事務(wù)管理器

使用事務(wù)之前當(dāng)然需要配置一個(gè)事務(wù)管理器,這里和Spring Boot 中配置沒(méi)差別,如下:

@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager txManager(final DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}

3. @ShardingTransactionType注解

想要開(kāi)啟XA分布式事務(wù)還需要使用一個(gè)注解@ShardingTransactionType,其中的value屬性的值如下:

  • TransactionType.LOCAL:開(kāi)啟本地事務(wù)的支持,默認(rèn)值
  • TransactionType.XA:開(kāi)啟XA事務(wù)的支持
  • TransactionType.BASE:開(kāi)啟弱事務(wù)的支持

那么顯然這里只需要配置TransactionType.XA就能開(kāi)啟XA事務(wù)的支持

偽代碼如下:

@ShardingTransactionType(value = TransactionType.XA)
@Transactional
public void method(){
//跨庫(kù)操作
..............
}

4. 啟動(dòng)測(cè)試

演示的源碼請(qǐng)看視頻教程中的源碼,需要注意的是Atomikos會(huì)在項(xiàng)目的logs目錄下生成xa_tx.log文件,其中記錄了事務(wù)日志,在XA崩潰恢復(fù)時(shí)所需要的日志,一定不要?jiǎng)h除

圖片

對(duì)于Atomikos的一些配置可以通過(guò)在項(xiàng)目的classpath中添加jta.properties來(lái)定制化Atomikos配置項(xiàng),這里就不再給大家詳細(xì)介紹了。

責(zé)任編輯:武曉燕 來(lái)源: 碼猿技術(shù)專(zhuān)欄
相關(guān)推薦

2019-12-27 16:00:56

分布式事務(wù)框架Java

2021-09-07 09:26:13

Python 開(kāi)發(fā)編程語(yǔ)言

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2022-06-21 08:27:22

Seata分布式事務(wù)

2017-07-26 15:08:05

大數(shù)據(jù)分布式事務(wù)

2022-09-29 08:28:57

SpringRedis分布式

2022-09-22 13:28:34

Redis分布式鎖

2020-07-30 09:35:09

Redis分布式鎖數(shù)據(jù)庫(kù)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2022-05-26 10:42:30

數(shù)據(jù)權(quán)限注解

2021-10-25 10:33:29

Python 開(kāi)發(fā)編程語(yǔ)言

2021-10-11 09:24:14

分布式架構(gòu)系統(tǒng)

2021-09-14 13:55:15

Go開(kāi)發(fā)分布式

2009-06-19 15:28:31

JDBC分布式事務(wù)

2021-09-29 09:07:37

分布式架構(gòu)系統(tǒng)

2009-09-18 15:10:13

分布式事務(wù)LINQ TO SQL

2021-03-18 09:18:39

分布式事務(wù)Saga

2024-02-19 00:00:00

Redis分布式

2023-09-04 08:45:07

分布式配置中心Zookeeper

2022-06-14 10:47:27

項(xiàng)目日志PUT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)