不应用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