ShardingSphere分库分表5-ShardingSphere的分布式事务详解
XA START:启动事务,生成全局事务ID。 XA PREPARE/COMMIT:对事务分支进行准备或提交。 XA ROLLBACK:事务回滚。 XA END:结束事务。 最大努力通知型:尽力通知其他参与方,适用于跨公司或流程复杂的场景。 补偿性:对未对齐的事务进行事后补偿。 异步确保型:通过消息队列实现异步确认。 两阶段型:通过事务协调者统一提交或回滚,适用于数据库操作。
发布日期:2021-04-30 21:02:47
浏览次数:121
分类:精选文章
本文共 4818 字,大约阅读时间需要 16 分钟。
ShardingJDBC分布式事务快速上手
ShardingJDBC支持三种分布式事务方式:LOCAL、XA 和 BASE。这三种事务实现方式均为对代码无侵入,具体见 TransactionTypeHolder.set(TransactionType.XA);。
LOCAL本地事务
LOCAL本地事务由数据库自行管理,通常通过Spring的@Transaction注解配置。这种方式不具备分布式事务特性,适用于单一数据库环境。
XA分布式事务
在ShardingJDBC中,XA事务由应用程序作为事务协调者,通过XA协议协调多个数据库的分库分表进行分布式事务。以下是XA事务的快速上手步骤:
引入依赖
- 在项目的 pom.xml 中添加ShardingSphere相关依赖:
org.apache.shardingsphere sharding-jdbc-core ${sharding-sphere.version} org.apache.shardingsphere sharding-transaction-xa-core ${sharding-sphere.version} org.apache.shardingsphere shardingsphere-transaction-xa-bitronix ${sharding-sphere.version} org.apache.shardingsphere shardingsphere-transaction-xa-narayana ${sharding-sphere.version} - 下载并引入XA事务所需的具体实现模块(如Bitronix或Narayana)。
配置事务管理器
- 创建事务管理器配置类:
@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); }} - 在事务管理器中注入ShardingSphere的数据源。
使用事务注解
- 在业务代码中使用XA事务注解:
@Transactional@ShardingTransactionType(TransactionType.XA)public void insert() { jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", new PreparedStatementCallback - 注意:XA事务默认使用Atomikos作为事务管理器,生成XA事务日志文件
xa_tx.log,请勿删除。
BASE柔性事务
BASE柔性事务由Seata框架协调,采用两阶段提交协议。以下是使用BASE事务的步骤:
部署Seata服务
- 下载并解压Seata服务和配置文件:
# 下载Seata服务wget https://github.com/seata/seata/releases/download/v1.4.0/seata-server-1.4.0.tar.gz# 启动Seata服务sh seata-server.sh -m standalone
- 配置
registry.conf和seata.conf:# registry.confregistry { type = "nacos" loadBalance = "RandomLoadBalance" loadBalanceVirtualNodes = 10 nacos { application = "seata-server" serverAddr = "192.168.65.232:8848" namespace = "public" group = "SEATA_GROUP" cluster = "default" username = "nacos" password = "nacos" }}# seata.confclient { application.id = example transaction.service.group = my_test_tx_group} - 将配置文件注册到Nacos:
sh nacos-config.sh localhost
配置客户端
- 在项目中引入Seata客户端依赖:
io.seata seata-all 1.4.0 com.alibaba.nacos nacos-client 1.4.1 - 创建undo_log表:
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';
配置事务组
- 在
seata.conf中配置事务组:service.vgroupMapping.my_test_tx_group = defaultservice.default.gouplist = 127.0.0.1:8091
- 将配置文件复制到ShardingSphere的类路径。
使用BASE事务
- 在业务代码中使用
@ShardingTransactionType(TransactionType.BASE)注解:@Transactional@ShardingTransactionType(TransactionType.BASE)public void insert() { // 业务逻辑代码 jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", new PreparedStatementCallback
分布式事务原理
XA事务
XA是X/Open组织提出的分布式事务规范,支持全球事务协调。MySQL从5.0.3版本开始支持XA事务(InnoDB引擎)。XA事务流程如下:
XA事务需要持久化全局事务状态,效率较低,适用于对强一致性要求高的场景。
BASE柔性事务
BASE柔性事务以最终一致性为目标,支持以下模式:
ShardingProxy分布式事务示例
ShardingProxy可通过配置proxy.transaction.type来选择事务类型,默认为LOCAL。使用XA事务时,直接注解@ShardingTransactionType(TransactionType.XA)即可。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2026年06月01日 02时12分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
RabbitMQ - 死信、TTL原理、延迟队列安装和配置
2023-03-01
PHP数据访问的多重查询(租房子查询)
2023-03-01
RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
2023-03-01
RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
2023-03-01
php数组函数分析--array_column
2023-03-01
php数组去重复数据的小例子
2023-03-01
php数组实现:哈希 +双向链表
2023-03-01
PHP数组排序函数array_multisort()函数详解(二)
2023-03-01
php数组的几个函数和超全局变量
2023-03-01
PHP文件上传详解
2023-03-01
PHP文件锁
2023-03-01
php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
2023-03-01
PHP时间戳和日期相互转换操作总结
2023-03-01
php时间戳知识点,php 时间戳函数总结与示例
2023-03-01
php更新数据库失败,php – 无法更新MySQL数据库
2023-03-01
php机器人聊天对话框,基于AIML的PHP聊天机器人
2023-03-01
PHP查找数组中最大值与最小值
2023-03-01
php查最大值,在PHP数组中查找最大值
2023-03-01
php根据年月日计算年龄
2023-03-01