共计 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
正文完