ShardingSphere分库分表5-ShardingSphere的分布式事务详解
发布日期:2021-04-30 21:02:47 浏览次数:121 分类:精选文章

本文共 4818 字,大约阅读时间需要 16 分钟。

ShardingJDBC分布式事务快速上手

ShardingJDBC支持三种分布式事务方式:LOCALXABASE。这三种事务实现方式均为对代码无侵入,具体见 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() {    @Override    public Object doCall(PreparedStatement preparedStatement) throws SQLException {      preparedStatement.setObject(1, i);      preparedStatement.setObject(2, "init");      preparedStatement.executeUpdate();      return null;    }  });}
    • 注意: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.confseata.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() {    @Override    public Object doCall(PreparedStatement preparedStatement) throws SQLException {      preparedStatement.setObject(1, i);      preparedStatement.setObject(2, "init");      preparedStatement.executeUpdate();      return null;    }  });}

  • 分布式事务原理

    XA事务

    XA是X/Open组织提出的分布式事务规范,支持全球事务协调。MySQL从5.0.3版本开始支持XA事务(InnoDB引擎)。XA事务流程如下:

  • XA START:启动事务,生成全局事务ID。
  • XA PREPARE/COMMIT:对事务分支进行准备或提交。
  • XA ROLLBACK:事务回滚。
  • XA END:结束事务。
  • XA事务需要持久化全局事务状态,效率较低,适用于对强一致性要求高的场景。

    BASE柔性事务

    BASE柔性事务以最终一致性为目标,支持以下模式:

  • 最大努力通知型:尽力通知其他参与方,适用于跨公司或流程复杂的场景。
  • 补偿性:对未对齐的事务进行事后补偿。
  • 异步确保型:通过消息队列实现异步确认。
  • 两阶段型:通过事务协调者统一提交或回滚,适用于数据库操作。

  • ShardingProxy分布式事务示例

    ShardingProxy可通过配置proxy.transaction.type来选择事务类型,默认为LOCAL。使用XA事务时,直接注解@ShardingTransactionType(TransactionType.XA)即可。

    上一篇:CSS盒子模型
    下一篇:网页设计经验分享

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2026年06月01日 02时12分40秒