分布式事務(wù)
1. 兩階段提交-XA
1.1 引入Maven依賴
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-transaction-xa-core</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
XA事務(wù)管理器將以SPI的方式被Sharding-JDBC所加載墓毒。
1.2 Atomikos參數(shù)配置 (可選)
ShardingSphere默認(rèn)的XA事務(wù)管理器為Atomikos,在項(xiàng)目的logs目錄中會(huì)生成xa_tx.log
, 這是XA崩潰恢復(fù)時(shí)所需的日志绞呈,請(qǐng)勿刪除纱意。
也可以通過在項(xiàng)目的classpath中添加jta.properties
來定制化Atomikos配置項(xiàng)婶溯。具體的配置規(guī)則請(qǐng)參考Atomikos的官方文檔。
2. 第三方BASE實(shí)現(xiàn)-Saga
目前Apache/incubator-shardingsphere暫無BASE事務(wù)的實(shí)現(xiàn),但是仍然可以使用第三方實(shí)現(xiàn)的Saga事務(wù)迄委。
項(xiàng)目地址: shardingsphere-spi-impl
文中涉及${shardingsphere-spi-impl.version}
的jar暫未發(fā)布到maven中央倉褐筛,因此需要您根據(jù)源碼自行部署。
2.1 引入Maven依賴
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-base-saga</artifactId>
<version>${shardingsphere-spi-impl.version}</version>
</dependency>
Saga事務(wù)管理器將以SPI的方式被Sharding-JDBC所加載叙身。
2.2 Saga相關(guān)配置
可以通過在項(xiàng)目的classpath中添加saga.properties
來定制化Saga事務(wù)的配置項(xiàng)渔扎。 配置項(xiàng)的屬性及說明如下:
屬性名稱 | 默認(rèn)值 | 說明 |
---|---|---|
saga.actuator.executor.size | 5 | Saga引擎所使用的線程池大小 |
saga.actuator.transaction.max.retries | 5 | Saga引擎對(duì)失敗SQL的最大重試次數(shù) |
saga.actuator.compensation.max.retries | 5 | Saga引擎對(duì)失敗SQL的最大嘗試補(bǔ)償次數(shù) |
saga.actuator.transaction.retry.delay.milliseconds | 5000 | Saga引擎對(duì)失敗SQL的重試間隔,單位毫秒 |
saga.actuator.compensation.retry.delay.milliseconds | 3000 | Saga引擎對(duì)失敗SQL的補(bǔ)償間隔信轿,單位毫秒 |
saga.persistence.enabled | false | Saga引擎對(duì)快照及執(zhí)行日志進(jìn)行持久化 |
saga.actuator.recovery.policy | ForwardRecovery | Saga引擎對(duì)失敗事務(wù)的補(bǔ)償策略晃痴,F(xiàn)orwardRecovery為最大努力送達(dá),BackwardRecovery為反向SQL補(bǔ)償 |
2.3 Saga 快照及日志持久化
當(dāng)saga.persistence.enabled
設(shè)置為true
時(shí)财忽,Saga引擎將會(huì)對(duì)事務(wù)的快照及執(zhí)行日志進(jìn)行持久化操作倘核。 持久化操作默認(rèn)通過HikariCP鏈接池寫入到MySQL、H2或PostgreSQL數(shù)據(jù)庫中即彪。 關(guān)于持久化的配置笤虫,同樣添加在saga.properties
中,配置項(xiàng)及說明如下:
屬性名稱 | 默認(rèn)值 | 說明 |
---|---|---|
saga.persistence.ds.url | 無 | Saga持久化的數(shù)據(jù)庫JDBC鏈接 |
saga.persistence.ds.username | 無 | Saga持久化的數(shù)據(jù)庫用戶名 |
saga.persistence.ds.password | 無 | Saga持久化的數(shù)據(jù)庫密碼 |
saga.persistence.ds.max.pool.size | 50 | Saga持久化的數(shù)據(jù)庫鏈接池最大連接數(shù) |
saga.persistence.ds.min.pool.size | 1 | Saga持久化的數(shù)據(jù)庫鏈接池最小連接數(shù) |
saga.persistence.ds.max.life.time.milliseconds | 0(無限制) | Saga持久化的數(shù)據(jù)庫鏈接最大存活時(shí)間祖凫,單位毫秒 |
saga.persistence.ds.idle.timeout.milliseconds | 60 * 1000 | Saga持久化的數(shù)據(jù)庫鏈接空閑回收時(shí)間琼蚯,單位毫秒 |
saga.persistence.ds.connection.timeout.milliseconds | 30 * 1000 | Saga持久化的數(shù)據(jù)庫鏈接超時(shí)時(shí)間,單位毫秒 |
由于用戶使用的數(shù)據(jù)庫類型與事務(wù)大小不一定一致惠况,因此可以在項(xiàng)目的classpath中添加schema-init.sql
來定制化持久化的表結(jié)構(gòu)遭庶,Saga引擎會(huì)自動(dòng)根據(jù)其中SQL創(chuàng)建。 如下以MySQL為例稠屠,用戶可自行修改峦睡,以匹配不同數(shù)據(jù)庫類型及字段長度。
-- MySQL init table SQL
CREATE TABLE IF NOT EXISTS saga_snapshot(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
transaction_id VARCHAR(255) null,
snapshot_id int null,
revert_context VARCHAR(255) null,
transaction_context VARCHAR(255) null,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX transaction_snapshot_index(transaction_id, snapshot_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS saga_event(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
saga_id VARCHAR(255) null,
type VARCHAR(255) null,
content_json TEXT null,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX saga_id_index(saga_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
2.4 Saga 快照及日志持久化SPI定制
默認(rèn)通過數(shù)據(jù)庫來持久化快照和日志并不一定能夠滿足用戶對(duì)業(yè)務(wù)和性能的需求权埠。因此Saga引擎提供SPI允許用戶定制化持久化部分榨了。 當(dāng)saga.persistence.enabled
設(shè)置為true
且Saga引擎監(jiān)測(cè)到有持久化SPI時(shí),Saga引擎將通過用戶實(shí)現(xiàn)的SPI代替默認(rèn)持久化進(jìn)行持久化工作攘蔽。 用戶只需要實(shí)現(xiàn)接口io.shardingsphere.transaction.saga.persistence.SagaPersistence
即可實(shí)現(xiàn)持久化SPI龙屉。 具體可參考項(xiàng)目sharding-transaction-base-saga-persistence-jpa
,Maven引入:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-base-saga-persistence-jpa</artifactId>
<version>${shardingsphere-spi-impl.version}</version>
</dependency>
2.5 Saga 注意事項(xiàng)
- 反向SQL需要主鍵满俗,請(qǐng)確保在表結(jié)構(gòu)中定義主鍵转捕。
- 對(duì)于
INSERT
語句, 需要在SQL中顯示插入主鍵值唆垃,如INSERT INTO ${table_name} (id, value, ...) VALUES (11111, '', ....) (其中id為表主鍵)
五芝。 - 若需要自動(dòng)生成主鍵,可使用ShardingSphere的分布式主鍵(分布式主鍵不能為聯(lián)合主鍵)辕万。
3. 分布式事務(wù)接入端
ShardingSphere的事務(wù)類型存放在TransactionTypeHolder
的本地線程變量中枢步,因此在數(shù)據(jù)庫連接創(chuàng)建前修改此值沉删,可以達(dá)到自由切換事務(wù)類型的效果。
注意:數(shù)據(jù)庫連接創(chuàng)建之后醉途,事務(wù)類型將無法更改矾瑰。
3.1 原生API
TransactionTypeHolder.set(TransactionType.LOCAL);
或
TransactionTypeHolder.set(TransactionType.XA);
或
TransactionTypeHolder.set(TransactionType.BASE);
3.2 Spring注解
@ShardingTransactionType(TransactionType.LOCAL)
@Transactional
或
@ShardingTransactionType(TransactionType.XA)
@Transactional
或
@ShardingTransactionType(TransactionType.BASE)
@Transactional
注意:@ShardingTransactionType
需要同Spring的@Transactional
配套使用,事務(wù)才會(huì)生效结蟋。
Spring boot starter
引入Maven依賴:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-jdbc-spring-boot-starter</artifactId>
<version>${shardingsphere-spi-impl.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<aspectjweaver.version>1.8.9</aspectjweaver.version>
<springframework.version>[4.3.6.RELEASE,5.0.0.M1)</springframework.version>
Spring namespace
引入Maven依賴:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-jdbc-spring</artifactId>
<version>${shardingsphere-spi-impl.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<aspectjweaver.version>1.8.9</aspectjweaver.version>
<springframework.version>[4.3.6.RELEASE,5.0.0.M1)</springframework.version>
加載切面配置信息
<import resource="classpath:META-INF/shardingTransaction.xml"/>