96SEO 2026-02-20 05:31 11
GlobalTransactional#xff1a;全局事务注解#xff0c;添加了以后可实现分布式事务的回滚和提交#xff0c;用法与spring…1.seata是什么?

是一款开源的分布式事务解决方案致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
GlobalTransactional全局事务注解添加了以后可实现分布式事务的回滚和提交用法与spring的Transactional注解类似注解参数的作用也基本一致
seata有四种事务模式分别为AT模式、TCC模式、Saga模式、XA模式此处只说明AT模式及TCC模式。
一阶段业务数据和回滚日志记录在同一个本地事务中提交释放本地锁和连接资源。
二阶段
提交异步化非常快速地完成。
回滚通过一阶段的回滚日志进行反向补偿。
我们首先抽象一个使用场景在用户购买行为的时候需要减少库存并减少账户余额当库存表
在同一个数据库时我们可以使用关系数据库自身提供的能力非常容易实现事务。
但如果这两个表分属于不同的数据源我们就要使用
commodityCode});jdbcTemplateB.update(update
的功能。
是的这里只是引入了一个注解就轻松实现了分布式事务能力使用
进行包装。
有关数据源代理帮助我们做了什么请阅读附录中的事务隔离。
模式后第二种支持的事务模式最早由蚂蚁金服贡献。
其分布式事务模型直接作用于服务层不依赖底层数据库可以灵活选择业务资源的锁定粒度减少资源锁持有时间可扩展性好可以说是为独立部署的
对于幂等、空回滚、悬挂问题的解决还请阅读对应于本篇文章的开发者指南。
完全不依赖底层数据库能够实现跨数据库、跨应用资源管理可以提供给业务方更细粒度的控制。
模式是高性能分布式事务解决方案适用于核心系统等对性能有很高要求的场景。
阶段协调所有资源管理器在第一阶段询问所有资源管理器“准备”是否成功如果所有资源均“准备”成功则在第二阶段执行所有资源的“提交”操作否则在第二阶段执行所有资源的“回滚”操作保证所有资源的最终状态是一致的要么全部提交要么全部回滚。
TCCTry-Confirm-Cancel是资源管理器的一种服务化的实现TCC
是一种比较成熟的分布式事务解决方案可用于解决跨数据库、跨服务业务操作的数据一致性问题TCC
BusinessActionContextParameter(paramName
doTransactionCommit(){tccActionOne.prepare(null,one);tccActionTwo.prepare(null,two);
BusinessActionContextParameter(paramName
seata的服务可去官网下载。
我使用seata和nacos集成在一起。
解压seata-server-$version.zip修改conf/registry.conf文件
2.由于使用nacos作为注册中心所以conf目录下的file.conf无需理会。
然后就可以直接启动bin/seata-server.bat可以在nacos里看到一个名为seata-server的服务了。
3.由于seata使用mysql作为db高可用数据库故需要在mysql创建一个dubbo-seata库并导入数据库脚本。
--------------------------------
--------------------------------
VARCHAR(32),transaction_service_group
service.vgroupMapping.ruoyi-system-groupdefault
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://127.0.0.1:3306/ry-seata?useUnicodetrue
store.db.globalTableglobal_table
store.db.branchTablebranch_table
5.nacos-config.sh复制到seata的conf下的README-zh.md
http://www.apache.org/licenses/LICENSE-2.0
inh)host$OPTARG;;p)port$OPTARG;;g)group$OPTARG;;t)tenant$OPTARG;;u)username$OPTARG;;w)password$OPTARG;;?)echo
contentTypecontent-type:application/json;charsetUTF-8echo
http://$nacosAddr/nacos/v1/cs/configs?dataId$(urlencode
$1)group$groupcontent$(urlencode
$2)tenant$tenantusername$usernamepassword$password
))key${line%%*}value${line#*}addConfig
6.执行命令后面填写nacos的IP地址我的是本机所以是127.0.0.1
代码示例仅展示AT模式。
工程分为4个分别为接口工程dubbo-demo-interface、用户管理工程dubbo-demo-user-provider、组织机构管理工程dubbo-demo-dept-provider、消费者模块dubbo-demo-consumer.
用户管理及组织机构管理为服务端消费者模块远程调用组织机构新增和用户管理新增使用seata的全局事务保证数据的一致性。
dubbo的相关代码此处不再详细说明有兴趣的可参考我的另一篇博客《dubbo的springboot集成》。
com.jc.shop.dubbo.demo.domain;/***
com.jc.shop.dubbo.demo.domain;import
com.jc.shop.dubbo.demo.service;import
com.jc.shop.dubbo.demo.domain.User;/***
com.jc.shop.dubbo.demo.service;import
com.jc.shop.dubbo.demo.domain.Dept;public
--dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactId!--
--version1.4.2/version/dependency!--
如果你的项目使用了Dubbo则需要添加Seata对Dubbo的支持
--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId!--
执行用户管理和组织机构的数据库脚本因为是demo所以将两个工程的表放在一个库中表分库存也是一样的因为两个工程的数据源是分开的
脚本中必须包含表“undo_log”如果分库每个库中都应该有该表该表用于记录数据库操作的日志用于事务回滚和提交。
${spring.application.name}application-id:
开启自动代理关闭自动代理适用于TCC模式enable-auto-data-source-proxy:
虚拟组和分组的映射vgroup-mapping:test-group:
#此处的test-group需和tx-service-group的值一致#
127.0.0.1:8848namespace:registry:type:
4UserServiceImpl.java实现上面定义的IUserService接口类
com.jc.shop.dubbo.demo.service.impl;import
com.jc.shop.dubbo.demo.domain.User;
com.jc.shop.dubbo.demo.mapper.UserMapper;
com.jc.shop.dubbo.demo.service.IUserService;
io.seata.core.context.RootContext;
org.apache.dubbo.config.annotation.DubboService;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Service;Service
{//打印事务ID在测试时只要用户新增和组织机构新增的事务ID相同就可以任务两个原子操作在同一个事务中。
System.out.println(用户新增的事务ID为
${spring.application.name}application-id:
开启自动代理enable-auto-data-source-proxy:
虚拟组和分组的映射vgroup-mapping:test-group:
127.0.0.1:8848namespace:registry:type:
4DeptServiceImpl实现IDeptService接口
com.jc.shop.dubbo.demo.service.impl;import
com.jc.shop.dubbo.demo.domain.Dept;
com.jc.shop.dubbo.demo.mapper.DeptMapper;
com.jc.shop.dubbo.demo.service.IDeptService;
io.seata.core.context.RootContext;
org.apache.dubbo.config.annotation.DubboService;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Service;Service
mapper.insert(dept);System.out.println(部门新增影响行数i);System.out.println(组织机构的事务ID为RootContext.getXID());return
${spring.application.name}application-id:
开启自动代理enable-auto-data-source-proxy:
虚拟组和分组的映射vgroup-mapping:test-group:
127.0.0.1:8848namespace:registry:type:
com.jc.shop.dubbo.demo.service.impl;import
com.jc.core.exception.ServiceException;
com.jc.shop.dubbo.demo.domain.Dept;
com.jc.shop.dubbo.demo.domain.User;
com.jc.shop.dubbo.demo.service.IConsumerService;
com.jc.shop.dubbo.demo.service.IDeptService;
com.jc.shop.dubbo.demo.service.IUserService;
io.seata.core.context.RootContext;
io.seata.spring.annotation.GlobalTransactional;
org.apache.dubbo.config.annotation.DubboReference;
org.springframework.stereotype.Service;Service
deptService;DubboReference(version
userService;OverrideGlobalTransactional(rollbackFor
{ServiceException.class})public
deptService.insert(dept);user.setDeptId(dept.getId());//此处在组织机构新增成功后故意抛出异常用于测试dept数据是否可以正常回滚。
if(i0){throw
userService.insert(user);System.out.println(用户新增影响行数j);return
}3定义controller层接口使用postman等工具进行测试
com.jc.shop.dubbo.demo.controller;import
com.jc.shop.dubbo.demo.domain.User;
com.jc.shop.dubbo.demo.service.IConsumerService;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.web.bind.annotation.PostMapping;
org.springframework.web.bind.annotation.RequestBody;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RestController;RestController
service;PostMapping(/insert)public
service.insertUser(user);if(i0)
AjaxResult.success(success);}else{return
经过测试发现dept表数据回滚成功数据为空若去掉抛异常的代码则组织机构t_dept和用户表t_user均可以保存成功。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback