分布式事务

ShardingDataSource已经整合了分布式事务的功能,因此不需要用户进行额外的配置,每次获取ShardingConnection前,通过修改TransactionTypeHolder,可以对事务类型进行切换。

XA事务

引入Maven依赖

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>sharding-transaction-xa-core</artifactId>
  4. <version>${shardingsphere.version}</version>
  5. </dependency>

JAVA编码方式设置事务类型

  1. TransactionTypeHolder.set(TransactionType.XA);

XA事务管理器参数配置(可选)

ShardingSphere默认的XA事务管理器为Atomikos,在项目的logs目录中会生成xa_tx.log, 这是XA崩溃恢复时所需的日志,请勿删除。

也可以通过在项目的classpath中添加jta.properties来定制化Atomikos配置项。具体的配置规则请参考Atomikos的官方文档

BASE(柔性)事务

ShardingSphere中已经整合了Saga和Seata两种BASE类型的事务

引入Maven依赖

  1. <!-- saga柔性事务 -->
  2. <dependency>
  3. <groupId>io.shardingsphere</groupId>
  4. <artifactId>sharding-transaction-base-saga</artifactId>
  5. <version>${shardingsphere-spi-impl.version}</version>
  6. </dependency>

${shardingsphere-spi-impl.version} 的jar暂未发布到maven中央仓,因此需要您根据源码自行部署。项目地址: shardingsphere-spi-impl

  1. <!-- seata柔性事务 -->
  2. <dependency>
  3. <groupId>org.apache.shardingsphere</groupId>
  4. <artifactId>sharding-transaction-base-seata-at</artifactId>
  5. <version>${sharding-sphere.version}</version>
  6. </dependency>

JAVA编码方式设置事务类型

  1. TransactionTypeHolder.set(TransactionType.BASE);

Saga配置

可以通过在项目的classpath中添加saga.properties来定制化Saga事务的配置项。当saga.persistence.enabled=true时,事务日志默认按JDBC的方式持久化到数据库中,也可以通过实现io.shardingsphere.transaction.saga.persistence.SagaPersistence SPI,支持定制化存储,具体可参考项目sharding-transaction-base-saga-persistence-jpa。

配置项的属性及说明如下:

属性名称默认值说明
saga.actuator.executor.size5使用的线程池大小
saga.actuator.transaction.max.retries5失败SQL的最大重试次数
saga.actuator.compensation.max.retries5失败SQL的最大尝试补偿次数
saga.actuator.transaction.retry.delay.milliseconds5000失败SQL的重试间隔,单位毫秒
saga.actuator.compensation.retry.delay.milliseconds3000失败SQL的补偿间隔,单位毫秒
saga.persistence.enabledfalse是否对日志进行持久化
saga.persistence.ds.url事务日志数据库JDBC连接
saga.persistence.ds.username事务日志数据库用户名
saga.persistence.ds.password事务日志数据库密码
saga.persistence.ds.max.pool.size50事务日志连接池最大连接数
saga.persistence.ds.min.pool.size1事务日志连接池最小连接数
saga.persistence.ds.max.life.time.milliseconds0(无限制)事务日志连接池最大存活时间,单位毫秒
saga.persistence.ds.idle.timeout.milliseconds60 1000事务日志连接池空闲回收时间,单位毫秒
saga.persistence.ds.connection.timeout.milliseconds30 1000事务日志连接池超时时间,单位毫秒

Saga事务日志表:

  1. -- MySQL init table SQL
  2. CREATE TABLE IF NOT EXISTS saga_event(
  3. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  4. saga_id VARCHAR(255) null,
  5. type VARCHAR(255) null,
  6. content_json TEXT null,
  7. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  8. INDEX saga_id_index(saga_id)
  9. )ENGINE=InnoDB DEFAULT CHARSET=utf8

在classpath中添加schema-init.sql可以定日志表,Saga引擎会完成初始化建表操作。

Seata配置

1.按照seata-work-shop中的步骤,下载并启动seata server,参考 Step6 和 Step7即可。

2.在每一个分片数据库实例中执创建undo_log表(目前只支持Mysql)

  1. CREATE TABLE IF NOT EXISTS `undo_log` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `branch_id` bigint(20) NOT NULL,
  4. `xid` varchar(100) NOT NULL,
  5. `rollback_info` longblob NOT NULL,
  6. `log_status` int(11) NOT NULL,
  7. `log_created` datetime NOT NULL,
  8. `log_modified` datetime NOT NULL,
  9. `ext` varchar(100) DEFAULT NULL,
  10. PRIMARY KEY (`id`),
  11. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

3.在classpath中修改seata.conf

  1. client {
  2. application.id = raw-jdbc ## 应用唯一id
  3. transaction.service.group = raw-jdbc-group ## 所属事务组
  4. }

分布式事务example