侧边栏壁纸
  • 累计撰写 81 篇文章
  • 累计创建 20 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

分布式事务的解决方案

心生向往
2021-08-23 / 0 评论 / 0 点赞 / 119 阅读 / 2,169 字

背景

数据库的水平分隔和微服务化的架构

一.产品选型

1.1、开源产品的比较
image.png
1.2、事务模式的比较
image.png
1.3、Seata的AT模式介绍

  • 分支的运行时序图

image.png

  • 防悬挂的措施
    回滚时发现回滚undo还未插入,则自动插入一条log_status=1的undo记录。本地事务(业务写操作sql和对应undo为一个本地事务)提交时会因为undo表主键冲突而提交失败。

二、如何集成Seata

2.1、POM引入新依赖(必选)

<dependency>
   <groupId>com.tao</groupId>
   <artifactId>znsd-common-tx</artifactId>
   <version>${common.version}</version>
</dependency>

2.2、配置信息(必选)

seata:
  #默认是true;设置为false将关闭seata服务。
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: znsd_tx_group
  service:
    vgroup-mapping:
      e3plus_tx_group: default
  registry:
    nacos:
      server-addr: ${spring.cloud.nacos.config.server-addr}
      namespace: ${nacos_namespace:}
      group : "SEATA_GROUP"
      cluster: default
    type: nacos
  client.rm.lock.retryTimes: 1
  client.rm.lock.retryPolicyBranchRollbackOnConflict: false

2.3、新增表(必选)

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `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(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

三、如何使用Seata

3.1、注解的方案
1、全局事务开始使用 @GlobalTransactional标识 。
2、每个本地事务方案仍然使用@Transactional标识。
3、@GlobalLock
有的方法它可能并不需要@GlobalTransactional的事务管理,但是我们又希望它对数据的修改能够加入到seata机制当中。那么这时候就需要@GlobalLock了。
加上了@GlobalLock,在事务提交的时候就回去checkLock校验一下全局锁。
4、客户端参数需关闭
client.rm.lock.retryPolicyBranchRollbackOnConflict: false

0

评论区