1. 下载seata
    2. 修改conf目录下的file.conf配置文件
      1. 先备份file.conf 文件
      2. 修改自定义事务组名称+事务日志存储模式为db+数据库连接
      3. image.png
      4. image.png

    创建seata数据库中的三个表:
    image.png

    1. 创建业务表和业务表的回滚日志表
      1. CREATE TABLE `undo_log` (
      2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
      3. `branch_id` bigint(20) NOT NULL,
      4. `xid` varchar(100) NOT NULL,
      5. `context` varchar(128) NOT NULL,
      6. `rollback_info` longblob NOT NULL,
      7. `log_status` int(11) NOT NULL,
      8. `log_created` datetime NOT NULL,
      9. `log_modified` datetime NOT NULL,
      10. `ext` varchar(100) DEFAULT NULL,
      11. PRIMARY KEY (`id`),
      12. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
      13. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
      image.png

    客户端配置:
    yml:

    cloud:
        alibaba:
          seata:
            # 自定义事务组名称需要与seata-server中的对应
            tx-service-group: fsp_tx_group
        nacos:
          discovery:
            server-addr: localhost:8848
    

    image.png
    image.png

    image.png
    上面这个是配置全局事务也就是 TM

    image.png
    一阶段执行完就释放了行锁
    image.png
    image.png

    总结:**
    配置seata - 图11
    每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有undo_log。

    在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。

    TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。

    第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。

    第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作

    Seata使用的是AT模式,锁的粒度更小了,在2pc中,需要全局等待协调者发送commit命令,各个参与者才能进行commit 这个阶段是需要进行行锁的
    但是AT模式,是各个事务都执行完而且自己会进行提交,异步方式进行的,本地事务释放本地锁,完全不需要等待其他事务执行完毕,他是否需要回滚是根据自己的log中判断