【系统开发】尚硅谷 - 谷粒商城项目笔记(八):Seata分布式事务

news2024/9/22 7:36:51

文章目录

  • Seata分布式事务
    • 简介
    • 事务的隔离级别
    • 事务传播行为
    • 本地事务@[Transactional](https://so.csdn.net/so/search?q=Transactional&spm=1001.2101.3001.7020)+传播行为
    • 分布式事务
    • CAP理论
    • 分布式事务常见解决方案
      • 2PC(两阶段提交,刚性事务)
      • TCC(柔性事务)
      • 可靠消息最终一致性(柔性事务)
      • 最大努力通知(柔性事务)
    • Seata环境准备
      • 创建 UNDO_LOG 表
      • 安装事务协调器
      • 修改配置文件 registry.conf
      • 切换到bin目录下,双击启动即可
      • 使用注解


Seata分布式事务

简介

如果一个事务中调用了外部服务,这就是分布式事务

image-20220303085925034

事务的隔离级别

Read uncommitted(读未提交):一个事务可以读取另一个未提交事务的数据。

举例:数据库中字段price为1000,A修改数据库为1500,此时B查看price为1500,结果A回滚了事务,数据库中数据还是1000。

结果:B出现脏读

Read committed(读已提交):一个事务要等另一个事务提交后才能读取数据。(针对的是UPDATE操作)

举例:数据库中字段price为1000,A查看数据为1000,告诉了C,此时B将数据进行了修改,修改为1600,当C去查看price为1600。

结果:出现了不可重复读现象

Repeatable read(可重复读):读取多条记录时,同一事务两次读取的数据条数不一致。在一条记录上的操作是,不能读取已由其它事务修改了但是未提交的行,其它任何事务也不能修改在当前事务完成之前由当前事务读取的数据。

举例:数据库中只有一条记录,当A查看时只有一条,A告诉C,此时B去数据库插入一条数据,C去查看时有两条。

结果:出现了幻读现象

Serializable (序列化):事务串行化顺序执行,可以避免脏读、不可重复读与幻读。

MYSQL隔离级别:可重复读

Oracle隔离级别:读已提交

img

事务传播行为

事务的传播行为:想要发生传播就一定要有两个以上的物体,而这里指的是两个方法都要在事务中进行,当一个事务方法A调用另一个事务方法B时,另一个事务方法B该如何运行。
Spring一共定义了7种事务传播行为(事务方法B该如何运行):

è¯·æ·»åŠ å›¾ç‰‡æè¿°

本地事务@Transactional+传播行为

//事务使用代理对象来控制
    @Transactional(timeout = 10)
    public void A(){
        //如果abc在同一个class类中,那么b,c做任何设置都没作用,都是和A公用一个事务,此时不生效,要使用代理
        B();
        C();
    }
    //    此时如果A有事务,就使用A的事务,A没有事务,就新建事务
    @Transactional(propagation = Propagation.REQUIRED,timeout = 5)
    public void B(){

    }
    //   不和A公用一个事务,新建事务
    @Transactional(propagation = Propagation.REQUIRES_NEW,timeout = 20)
    public void C(){

    }
/*本地事务失效问题:
同一个对象内事务方法互调默认失效,原因 绕过了代理对象,事务使用代理对象来控制的
 解决:使用代理对象来调用事务方法
 针对:本类方法互调使用事务
1)引入spring-boot-starter-aop;引入aspectj
2)主启动类@EnableAspectJAutoProxy(exposeProxy = true);
开启aspectj动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理)。
  exposeProxy = true:对外暴露代理对象
 3)用代理对象本类互调
   使用:OrderService orderService = AopContext.currentProxy();       orderService.b();  orderService.c();
   */
    @Transactional(timeout = 10)
    public void A(){
        //b,c做任何设置都没作用,都是和A公用一个事务,此时不生效,要使用代理
        OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();       
        orderService.B();  
        orderService.C();
    }

分布式事务

分布式系统之所以叫分布式,是因为提供服务的各个节点分布在不同机器上,相互之间通过网络交互。不能因为有一点网络问题就导致整个系统无法提供服务,网络因素成为了分布式事务的考量标准之一。

分布式事务产生的场景

分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。
分布式经常出现的异常:机器宕机,网络异常,消息丢失,消息乱序,数据错误,不可靠的TCP,存储数据丢失。。。

CAP理论

C:Consistency(强一致性)

A:Availability(可用性)

P:Partition tolerance(分区容错性)

CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

CP-满足一致性,分区容错的系统,通常性能不是特别高。

AP-满足可用性,分区容错的系统,通常对一致性要求略低一些。

在当前分布式的大环境中,P已经成为必不可少!!!

注意:CAP不可能三者同时兼顾,甚至连CA都不可能会有!(CA最多只有在本地运行可以做到)

当前主流技术对CAP的使用:必然会接触到分布式系统,例如:zookeeper就是使用CP原则,eureka使用AP原则

raft算法:https://www.bilibili.com/video/BV1np4y1C7Yf?p=286

分布式事务常见解决方案

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。

2PC(两阶段提交,刚性事务)

数据库支持的2PC【二阶段提交】,又被称为XA Transactions

Mysql从5.5开始支持,SQL Server 2005开始支持,Oracle 7开始支持。

其中XA是一个两阶段提交协议:

第一阶段为 准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。

第二阶段为提交阶段(commit)。当transaction manager确认所有参与者都ready后,向所有参与者发送commit命令。

其中如果有任何一个数据库否决此次提交,那么所有数据库都会被要求回滚他们在此事务中的那部分信息
优缺点:

  • XA协议比较简单,商业数据库使用,使用分布式事务的成本低。
  • XA性能不理想,特别是交易下单链路,往往并发量很高,XA无法满足高并发场景。
  • XA在商业数据库支持比较理想,在mysql数据库支持不太理想,MYSQL的XA实现没有记录prepare阶段日志,主备切换导致主库和备库数据不一致。
  • 也有3PC,引入超时机制(无论协调者还是参与者,在向对方发送请求后,若长时间未收到回应则做出相应处理)

TCC(柔性事务)

**刚性事务:**遵循ACID原则,强一致性。

**柔性事务:**遵循BASE理论,最终一致性。

TCC 模式,不依赖于底层数据资源的事务支持:

**一阶段 prepare 行为:**调用 自定义 的 prepare 逻辑。

**二阶段 commit 行为:**调用 自定义 的 commit 逻辑。

**三阶段 rollback 行为:**调用 自定义 的 rollback 逻辑。

所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。

可靠消息最终一致性(柔性事务)

可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,**事务参与方(消息消费者)一定能够接收消息并处理事务成功,**此方案强调的是只要消息发给事务参与方最终事务要达到一致。

最大努力通知(柔性事务)

按规律进行通知,不保证数据一定能通知成功,但是会提供可查询操作接口进行核对。

用途:用在与第三方进行通讯时,如:微信支付宝支付后的支付结果通知。结合MQ进行实现,通过MQ发送http请求,设置最大通知次数,次数到达就不通知。

案例:银行通知,商户通知,支付宝支付成功异步回调。

Seata环境准备

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

image

创建 UNDO_LOG 表

SEATA AT 模式需要 UNDO_LOG

-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

安装事务协调器

seata-server https://github.com/seata/seata/releases

修改配置文件 registry.conf

在这里插å
¥å›¾ç‰‡æè¿°

在这里插å
¥å›¾ç‰‡æè¿°

切换到bin目录下,双击启动即可

使用注解

在这里插å
¥å›¾ç‰‡æè¿°

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

头一次见单例模式讲的如此透彻

简介 单例模式是一种常用的软件设计模式,用于创建类型。通过单例模式的方法创建的类在当前进程中只有一个实例。单例模式的类只能允许一个实例存在。单例模式的作用是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个…

【springboot整合】Spring缓存抽象

JSR-107简介 为了统一缓存开发规范,以及提升缓存开发的扩展性,J2EE发布了JSR-107缓存开发规范。 Java Caching定义了5个核心接口,分别是CachingProvider、CacheManger、Cache、Entry和Expiry CachingProvider:定义了创建、配置…

基于Java毕业论文管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

Redis【入门篇】---- Redis常见命令

Redis【入门篇】---- Redis常见命令 1. Redis数据结构介绍2. Redis 通用命令3. Redis命令-String命令4. Redis命令-Key的层级结构5. Redis命令-Hash命令6. Redis命令-List命令7. Redis命令-Set命令8. Redis命令-SortedSet类型 1. Redis数据结构介绍 Redis是一个key-value的数据…

调查问卷Type Form的集成

简介 Typeform是一家制作线上调查问卷的公司。 Muoz 和 David Okuniev两人于2012年创作出一个更加动态、更具交互性的用户调查工具,每次只提一个问题,并且根据用户的回答为其呈现下一个问题,像和朋友间的对话一样,让用户在不知不…

边缘计算开源平台

边缘计算 文章目录 边缘计算前言01 边缘计算开源平台概述02 面向物联网端的边缘计算开源平台2.1 EdgeXFoundry2.2 ApacheEdgent 03 面向边缘云的边缘计算开源平台3.1 CORD3.2 Akraino EdgeStack 04 面向云边融合的边缘计算开源平台05 构建边缘计算平台的开源软件06 结束语 前言…

类皮肤全属性凝胶电子皮肤

目前电子皮肤相关工作仅①提升单一或几个刺激感知属性(压力、温度等);②研究部分理化属性和感知属性的结合。但这些工作仅覆盖皮肤的两种或三种属性,距离实现皮肤般丰富的刺激感知感官和理化特性还有很大差距。而覆盖人类皮肤的所…

linux-virtualbox安装centOS7.9

一、windows10安装virtualbox 安装包->右键->以管理员身份运行->下一步 ->选择安装位置->下一步 ->是(网络中断?) ->是(安装一些辅助工具包) ->安装 ->完成 二、virtualbox新建centOS7.9虚…

【Python 基础篇】Python 文件操作

文章目录 导言一、文件操作的作用二、文件的基本操作1、打开文件2、读写文件① 读取文件② 写入文件 3、关闭文件 三、文件备份四、文件和文件夹的操作结语 导言 在编程领域中,文件操作是一项基础且常见的任务。无论是读取配置文件、处理数据文件,还是备…

MySQL保姆安装教程

文章目录 前言一、MySQL官网二、离线安装包步骤三、环境配置四、验证安装是否成功在这里插入图片描述 五、可视化工具连接总结 前言 对于第一次安装mysql是有点难度,现在我会把安装流程搞出来。 一、MySQL官网 MySQL Installer 8.0.33安装(不想安装这个…

Windows下redis的安装与使用

一、下载 redis.io 官网没有Windows版本的,需要去redis-windows下载。 二、使用与配置 2.1 解压安装 redis的Windows版本,有.msi和.zip两种格式。这里使用更为方便,直接解压就可以使用的.zip格式。 将Redis-x64-5.0.14.1.zip解压至D盘的…

【Java-SpringBoot+Vue+MySql】Day3.3-MybatisPlus说明与使用

目录 一、MybatisPlus快速入门 1、知识轰炸 2、实操演练 (1)新建项目 (2)添加依赖 (3)添加配置 (4)添加映射层 (5)启动类中添加注解 (6&a…

【通过Data Studio连接openGauss】---快速入门

【通过Data Studio连接openGauss】---快速入门 🔻 一、访问openGauss🔰 1.1 确认连接信息(单节点)🔰 1.2 使用gsql访问openGauss(本地连接数据库)🔰 1.3 使用gsql访问openGauss&…

玩机搞机------安卓手机分区操作中的的各种工具 提取分区 备份分区 檫除分区 推荐一

喜欢玩机搞机的朋友们经常对手机系统进行安装玩机操作。但有时候指令类输入和操作步骤比较繁琐。耽误时间。有些工具就比较方便操作。陆续会整理一些玩机搞机中的简单工具给爱好者使用。本期整理一些关于手机分区的工具推荐 💔💔💔 AB AVB分…

Android的详细介绍

目录: Android诞生 Android系统架构 Android系统版本 Android应用开发特色 Android诞生 2003年10月,Andy Rubin等人创建了Android公司,并组建了Android团队。 2005年8月17日,Google低调收购了成立仅22个月的高科技企…

【新星计划·2023】Linux目录结构

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Linux目录结构与功能,以及目录解释,最近这段时间会持续更新关于Linux的基础知识,期待你的…

机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…

macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持…

macOS Big Sur 11.7.8 (20G1351) 正式版 ISO、PKG、DMG、IPSW 下载

macOS Big Sur 11.7.8 (20G1351) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Window…

Windows 10 |VMware开启虚拟化的最全面说明

前言: Windows作为工作机,对于计算机系的同学来说,主要是在于利用图形化的界面直观的创建虚拟机(典型的有代表性的是virtualbox和VMware这两家公司的桌面级虚拟化软件),尤其是小白这样的初学者&#xff0c…