不应用Spring

引入Maven依赖

<dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-core</artifactId>    <version>${sharding-sphere.version}</version></dependency><!-- 应用XA事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-xa-core</artifactId>    <version>${shardingsphere.version}</version></dependency><!-- 应用BASE事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-base-seata-at</artifactId>    <version>${sharding-sphere.version}</version></dependency>

基于Java编码方式应用分布式事务

TransactionTypeHolder.set(TransactionType.XA); // 反对TransactionType.LOCAL, TransactionType.XA, TransactionType.BASEtry (Connection connection = dataSource.getConnection()) { // dataSource的类型为ShardingDataSource    connection.setAutoCommit(false);    PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO t_order (user_id, status) VALUES (?, ?)");    preparedStatement.setObject(1, i);    preparedStatement.setObject(2, "init");    preparedStatement.executeUpdate();    connection.commit();}

应用Spring-namespace

引入Maven依赖

<dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-spring-namespace</artifactId>    <version>${shardingsphere.version}</version></dependency><!-- 应用XA事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-xa-core</artifactId>    <version>${shardingsphere.version}</version></dependency><!-- 应用BASE事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-base-seata-at</artifactId>    <version>${sharding-sphere.version}</version></dependency>

配置spring-namespace的事务管理器

<!-- 进行ShardingDataSource的相干配置 -->...<!-- 开启主动扫描@ShardingTransactionType注解,应用Spring原生的AOP在类和办法上进行加强 --><sharding:tx-type-annotation-driven /><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="shardingDataSource" /></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">    <property name="dataSource" ref="shardingDataSource" /></bean><tx:annotation-driven />

业务代码中应用分布式事务

@Transactional@ShardingTransactionType(TransactionType.XA)  // 反对TransactionType.LOCAL, TransactionType.XA, TransactionType.BASEpublic void insert() {    jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", (PreparedStatementCallback<Object>) preparedStatement -> {        preparedStatement.setObject(1, i);        preparedStatement.setObject(2, "init");        preparedStatement.executeUpdate();    });}

应用Spring-boot

引入Maven依赖

<dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>    <version>${shardingsphere.version}</version></dependency><!-- 应用XA事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-xa-core</artifactId>    <version>${shardingsphere.version}</version></dependency><!-- 应用BASE事务时,须要引入此模块 --><dependency>    <groupId>org.apache.shardingsphere</groupId>    <artifactId>sharding-transaction-base-seata-at</artifactId>    <version>${sharding-sphere.version}</version></dependency>

配置spring-boot的事务管理器

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

业务代码中应用分布式事务

@Transactional@ShardingTransactionType(TransactionType.XA)  // 反对TransactionType.LOCAL, TransactionType.XA, TransactionType.BASEpublic void insert() {    jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", (PreparedStatementCallback<Object>) preparedStatement -> {        preparedStatement.setObject(1, i);        preparedStatement.setObject(2, "init");        preparedStatement.executeUpdate();    });}

分布式事务管理器的特有配置

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

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

也能够通过在我的项目的classpath中增加jta.properties来定制化Atomikos配置项。具体的配置规定请参考Atomikos的官网文档。

BASE柔性事务管理器(SEATA-AT配置)

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

2.在每一个分片数据库实例中执创立undo_log表(以MySQL为例)

CREATE TABLE IF NOT EXISTS `undo_log`(  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT COMMENT 'increment id',  `branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id',  `xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id',  `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',  `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',  `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',  `log_created`   DATETIME     NOT NULL COMMENT 'create datetime',  `log_modified`  DATETIME     NOT NULL COMMENT 'modify datetime',  PRIMARY KEY (`id`),  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = InnoDB  AUTO_INCREMENT = 1  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

3.在classpath中减少seata.conf

client {    application.id = example    ## 利用惟一id    transaction.service.group = my_test_tx_group   ## 所属事务组}

4.依据理论场景批改seata的file.conf和registry.conf文件

分布式事务example

  • 官网example