Seata 的 AT 模式

目录

概述

Springcloud 整合 Seata

数据库脚本

服务依赖

Springboot 配置

代码改造

AT模式下的数据隔离

写隔离

读隔离


概述

   Seata 的 AT 模式是 Seata 的默认模式,它的原理是依赖于数据库事务,以数据库事务保证本地事务分支特性,结合 Seata的 Undo 日志记录做事务补偿,来实现的一种二阶段事务。总体来讲,Seata 的AT模式使用起来比较简单,对业务代码的侵入性比较低。

 Demo

   这里附上seata的学习代码demo,开箱即用。包含AT/TCC/XA等模式的使用案例https://download.csdn.net/download/lmj3732018/88864802

Springcloud 整合 Seata

数据库脚本

 AT 模式需要在每个本地事务分支所在的数据库中添加一个 undo_log 表,用于存储本地事务分支的事务记录。

数据库脚本地址:https://github.com/apache/incubator-seata/blob/v1.7.0/script/client/at/db/mysql.sql

服务依赖

  Seata 的依赖版本最好参照官网推荐的版本对照,否则,可能出现不兼容的一些问题,同时 Seata 客户端与服务端的版本也最好保持一致

 POM依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!--nacos 注册中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><!-- seata-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

Springboot 配置

seata:application-id: ${spring.application.name}# 这个值要与服务端 service.vgroupMapping.default_tx_group=default 相对应,服务端的值default与下面的 cluster: default 对应。tx-service-group: default_tx_groupregistry:type: nacosnacos:application: seata-serverserver-addr: 192.168.122.120:8848namespace: seata-idgroup: SEATA_GROUPusername: nacospassword: nacoscluster: defaultconfig:type: nacosnacos:server-addr: 192.168.122.120:8848namespace: seata-idgroup: SEATA_GROUPdata-id: seataServer.propertiesusername: nacospassword: nacos

代码改造

代码上的改造比较简单,只需在事务发起者的接口方法上添加一个@GlobalTransactional(name="createOrder",rollbackFor=Exception.class)注解。分支事务那边则不用做任何处理

 @Override//@Transactional@GlobalTransactional(name="createOrder",rollbackFor=Exception.class)public Order saveOrder(OrderVo orderVo) {log.info("=============用户下单=================");log.info("当前 XID: {}", RootContext.getXID());// 保存订单Order order = new Order();order.setUserId(orderVo.getUserId());order.setCommodityCode(orderVo.getCommodityCode());order.setCount(orderVo.getCount());order.setMoney(orderVo.getMoney());order.setStatus(OrderStatus.INIT.getValue());Integer saveOrderRecord = orderMapper.insert(order);log.info("保存订单{}", saveOrderRecord > 0 ? "成功" : "失败");//扣减库存storageFeignService.deduct(orderVo.getCommodityCode(), orderVo.getCount());if(true){throw new RuntimeException();}//扣减余额Boolean debit= accountFeignService.debit(orderVo.getUserId(), orderVo.getMoney());//        if(!debit){
//            // 解决 feign整合sentinel降级导致Seata失效的处理
//            throw new RuntimeException("账户服务异常降级了");
//        }//更新订单Integer updateOrderRecord = orderMapper.updateOrderStatus(order.getId(),OrderStatus.SUCCESS.getValue());log.info("更新订单id:{} {}", order.getId(), updateOrderRecord > 0 ? "成功" : "失败");return order;}

AT模式下的数据隔离

写隔离

AT模式下通过全局锁来保证写操作的隔离性,避免产生脏读。当全局事务A在操作某一条记录时,会给这条记录加一个全局锁,所谓的全局锁实际是指这条记录的ID,当本地事务提交,而全局事务没提交时。我们虽然通过直接操作数据库可以看到这条提交的数据,但是当开启另一个全局事务去操作这条数据时,则会先判断全局锁的存在,如果存在则默认将当前事务回滚(也可修改策略为不断尝试获取全局锁)。

读隔离

AT模式默认情况下,如果数据库的隔离级别为“读已提交”,则全局事务的隔离级别为"读未提交"。AT模式仅仅对 带有 "select  for update"的语句会检查全局锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485404.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理-第153期 Oracle Vector DB AI-05(20240221)

数据库管理153期 2024-02-21 数据库管理-第153期 Oracle Vector DB & AI-05&#xff08;20240221&#xff09;1 Oracle Vector的其他特性示例1&#xff1a;示例2 2 简单使用Oracle Vector环境创建包含Vector数据类型的表插入向量数据 总结 数据库管理-第153期 Oracle Vecto…

navicat导出数据库表结构信息

需求阐述 要求导出某一数据库表中的所有表的结构&#xff0c;汇总成一个word 准备工作 拿到所有表名&#xff0c;在navicat中执行sql语句&#xff1a;show tables;然后点击导出结果&#xff0c;选择excel格式进行导出。 拿到该数据库所有表名后&#xff0c;在navicat中执行如…

20.scala视图界定

目录 概述实践代码执行 结束 概述 scala 中的视图界定 实践 代码 /*** 视图界定*/ object Genericity03 {def main(args: Array[String]): Unit {println(new MaxInt(1,2).compare)println(new MaxLong(1L,2L).compare)// 不行 // println(new MaxValue(1,2).compare)// …

十九、图像的放缩和插值

项目功能实现&#xff1a;对一张图像进行放大和缩小操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 resizing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class RESIZING { public:void resizing(Mat& image); };#pragma…

HCIP-OSPF综合实验、MGRE搭建、OSPF基本配置、重发布、路由聚合、NAT、加快收敛、更新认证

OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 采用最短路径SPF&#xff08;Shortest Path First&#xff09;算法。通过链路状态通告LSA&#xff08;Link State …

APP的UI自动化demo(appium+java)

文章目录 appium连接手机java代码实现-第一版第二版-接入testng和隐式等待显示等待 appium连接手机 准备工作 1、查看连接手机模拟器是否连接成功&#xff0c;获取设备名称 执行命令&#xff1a;adb devices 2、查看android内核版本号—>paltformVersion 执行命令&#xf…

文件包含+文件上传漏洞(图片马绕过)

目录 一.文件包含二.文件上传三.图片马四.题目 一.文件包含 将已有的代码以文件形式包含到某个指定的代码中&#xff0c;从而使用其中的代码或者数据&#xff0c;一般是为了方便直接调用所需文件&#xff0c;文件包含的存在使得开发变得更加灵活和方便&#xff08;若对用户输入…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

原型模式(Prototype Pattern) C++

上一节&#xff1a;建造者模式&#xff08;Builder Pattern&#xff09;C 文章目录 0.理论1.原型模式的核心组成&#xff1a;2.实现方法3.什么时候使用 1.实践步骤 1: 定义怪物原型步骤 2: 实现具体怪物原型步骤 3: 使用原型创建怪物 0.理论 原型模式&#xff08;Prototype P…

springmvc+ssm+springboot房屋中介服务平台的设计与实现 i174z

本论文拟采用计算机技术设计并开发的房屋中介服务平台&#xff0c;主要是为用户提供服务。使得用户可以在系统上查看房屋出租、房屋出售、房屋求购、房屋求租&#xff0c;管理员对信息进行统一管理&#xff0c;与此同时可以筛选出符合的信息&#xff0c;给笔者提供更符合实际的…

数字孪生城市为何备受追捧?其应用场景有多宽?

数字孪生的“虚拟副本”让城市治理不再盲人摸象。 从城市治理的角度来看&#xff0c;数字孪生城市相当于真实世界的“操作系统”&#xff0c;有了它就可以远程对城市的每一个角落进行监测、智慧调度&#xff0c;无论是街道、社区&#xff0c;还是商场、变电站乃至城市排水系统…

文献速递:GAN医学影像合成--基于生成对抗网络的肺部图像分类的多域医学图像翻译生成

文献速递&#xff1a;GAN医学影像合成–基于生成对抗网络的肺部图像分类的多域医学图像翻译生成 01 文献速递介绍 在2019年底&#xff0c;一种称为2019冠状病毒病&#xff08;COVID-19&#xff09;的新型冠状病毒肺炎出现&#xff0c;迅速成为全球性大流行。感染COVID-19可以…