ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分库分表ShardingSphere<三> _ 分布式事务

2021-12-20 21:04:16  阅读:275  来源: 互联网

标签:事务 分库 ShardingSphere XA 回滚 提交 分表 RM 分布式


目录

一、分布式事务

1. LOCAL事务

2. XA事务

3. BASE事务(柔性事务)

二、示例

1. 依赖jar包

2. 配置XA事务

3. 使用XA事务

三、参考资料


一、分布式事务

        ShardingSphere提供三种事务类型:LOCAL(默认)、XA 和 BASE。见枚举类org.apache.shardingsphere.transaction.core.TransactionType。

1. LOCAL事务

支持:单库事务(可分表);因逻辑异常导致的跨库事务(如:同一事务中,跨两个库更新。更新完毕后,抛出空指针,则两个库都能够回滚)

不支持:因网络、硬件异常导致的跨库事务。如:同一事务中,跨两个库更新,更新完毕后、未提交之前,第一个库宕机,则只有第二个库数据提交,且无法回滚。

2. XA事务

        Shardingsphere整合Atomikos对XA分布式事务的支持。XA事务,属于两阶段提交事务。如下图所示。

支持:跨库事务;两阶段提交保证操作的原子性和数据的强一致性;服务宕机重启后,提交/回滚中的事务可自动恢复;支持XA 和非XA的连接池

不支持:服务宕机后,在其它机器上恢复提交/回滚中的数据

1):两阶段提交

AP(Application Program _ 应用程序):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作。
RM(Resource Manager _ 资源管理器):如数据库、文件系统等,并提供访问资源的方式。
TM(Transaction Manager _ 事务管理器):事务协调者,负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。 

XA二阶段提交:

  • 阶段一:TM通知各个RM准备提交它们的事务分支。如果RM判断自己的工作可以被提交(进行持久化),再给TM肯定答复;其中一个RM有异常情况时,TM对所有RM都是回滚。在发送了否定答复并回滚之后,RM就可以丢弃这个事务分支信息。
  • 阶段二:TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。

2):MySQL的XA事务状态

  • xa_start:在RM端调用时开启一个XA事务,后面需要接上XID作为参数
  • xa_end:取消当前线程与事务的关联,与xa_start是配对使用
  • xa_prepare:询问RM是否已经准备好了提交事务
  • xa_commit:通知RM提交事务分支
  • xa_rollback:通知RM提交回滚事务分支 

3. BASE事务(柔性事务)

        BASE事务,属于柔性事务,数据最终一致性。如下图所示。ShardingSphere集成了SEATA作为柔性事务的使用方案。

支持:跨库事务;支持RC隔离级别;undo快照进行事务回滚;服务宕机后的,自动恢复提交中的事务

不支持:不支持除RC之外的隔离级别

  • 同步送达:sql在执行前记录日志,如果执行成功,把日志删除;如果执行失败,重试一定次数(如果未达到最大尝试次数便执行成功了,一样删除日志)。
  • 异步送达:异步任务不断扫描执行日志,如果重试次数未达到最大上限,尝试重新执行;如果执行成功,删除日志。 

二、示例

1. 依赖jar包

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-transaction-xa-core</artifactId>
    <version>4.1.1</version>
</dependency>

2. 配置XA事务

package com.common.instance.test.config.transaction;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

/**
 * @description 分布式事务XA配置
 * @author tcm
 * @version 1.0.0
 * @date 2021/12/15 16:44
 **/
@Component
@EnableTransactionManagement
public class ShardingTransactionXAConfig {

    // TM配置
    @Bean
    public PlatformTransactionManager txManager(final DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    // RM配置
    @Bean
    public JdbcTemplate jdbcTemplate(final DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

3. 使用XA事务

注意:@Transactional与@ShardingTransactionType一起使用,而需要设置使用事务类型,参考枚举类org.apache.shardingsphere.transaction.core.TransactionType。

@Transactional
@ShardingTransactionType(TransactionType.XA)
@Override
public void testTransactionXA() {
    // 获取分布式主键
    String tabId = getRedisId();

    // 组装对象
    WcPendantTabDetail wcPendantTabDetail = getWcPendantTabDetail(tabId);
    WcPendantTabExtend wcPendantTabExtend = getWcPendantTabExtend(wcPendantTabDetail);

    // 保存DB
    int detail = wcPendantTabDetailDao.insert(wcPendantTabDetail);
    LogUtil.info(String.format("insert wcPendantTabDetail: %s", detail));

    Long.parseLong("adfg");

    int extend = wcPendantTabExtendDao.insert(wcPendantTabExtend);
    LogUtil.info(String.format("insert wcPendantTabExtend: %s", extend));
}

三、参考资料

XA 事务 :: ShardingSphere

ShardingSphere的分布式事务 - 天宇轩-王 - 博客园

sharding-jdbc事务解读_yanyan19880509的专栏-CSDN博客_shardingjdbc 事务

Shardingsphere整合Atomikos对XA分布式事务的支持(2)_ShardingSphere官微-CSDN博客

atomikos分布式事务_Shardingsphere整合Atomikos对XA分布式事务的支持(1)_孔钧的博客-CSDN博客

atomikos分布式事务_Shardingsphere整合Atomikos对XA分布式事务的支持(1)_孔钧的博客-CSDN博客

标签:事务,分库,ShardingSphere,XA,回滚,提交,分表,RM,分布式
来源: https://blog.csdn.net/m0_37543627/article/details/122043057

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有