关于数据库:ShardingSphere-4x-ShardingJDBC-用户手册之分布式事务

37次阅读

共计 4884 个字符,预计需要花费 13 分钟才能阅读完成。

不应用 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.BASE
try (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.BASE
public 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
@EnableTransactionManagement
public 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.BASE
public 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

正文完
 0