Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。因此,客户端承担了TM和TM的角色。
服务端见博文:https://blog.csdn.net/chuixue24/article/details/108071970
本文为实现seata分布式事务中的AT模式。
在与dubbo进行整合时,客户端又分为dubbo的服务提供端(Provider)和消费端(consumer),下边是对这两种类型客户端的整合示例。
seata客户端——服务提供端
执行脚本
客户端也需要执行sql脚本:
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE seata_undo_log
(
id NUMBER(19) NOT NULL,
branch_id NUMBER(19) NOT NULL,
xid VARCHAR2(100) NOT NULL,
context VARCHAR2(128) NOT NULL,
rollback_info BLOB NOT NULL,
log_status NUMBER(10) NOT NULL,
log_created TIMESTAMP(0) NOT NULL,
log_modified TIMESTAMP(0) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT ux_undo_log UNIQUE (xid, branch_id)
);
COMMENT ON TABLE seata_undo_log IS 'AT transaction mode undo table';
-- Generate ID using sequence and trigger
CREATE SEQUENCE UNDO_LOG_SEQ START WITH 1 INCREMENT BY 1;
部署所需脚本见:https://github.com/seata/seata/tree/1.3.0/script
引入依赖
compile group: 'io.seata', name: 'seata-all', version: '1.3.0'
配置文件
修改registry.conf(修改内容和服务端保持一致,如何修改可以参考
https://blog.csdn.net/chuixue24/article/details/108071970#%E4%BF%AE%E6%94%B9registry.conf%C2%A0),
修改后放入工程的resource目录下:
数据源代理DataSourceProxy
如果是用springboot或springcloud,可以参考http://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
我的项目是一个基于spring4.3的旧项目,还是xml配置文件的形式。
DataSourceProxy源码分析可以参考:https://blog.csdn.net/a315157973/article/details/105466230
全局事务扫描器GlobalTransactionScanner
GlobalTransactionScanner源码分析可以参考:https://blog.csdn.net/a315157973/article/details/104288598
以上配置有这么一句:<constructor-arg value="my_test_tx_group"/> ,my_test_tx_group为事务组,是在config.txt文件中指定的
<constructor-arg value="mdm"/>中的mdm为当前项目的dubbo应用名字:
启动
如果是一个服务提供端,那么以上配置就可以了。启动刚配置的工程,启动成功会看到:
如果启动过程中有以下错误:
ERROR | no available service 'null' found, please make sure registry config correct
请检查从config.txt导入到nacos中的 service.vgroupMapping.后的名字是否和全局扫描器中的事务局是否一致。
seata客户端——消费端
消费端的配置和服务提供的的配置差不多一样,不同的是,消费端会调用服务端,调用时会用到seata的@GlobalTransactional注解:
分布式事务测试
在测试代码中,会抛出一个异常:
消费端控制台日志:
服务提供端日志:
查数据库结果,在java.lang.ArithmeticException: / by zero异常前插入数据库的记录已删除,说明分布式事务是生效的。