SpringCloud--分布式事务

1.什么是事务

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。

2.事务的ACID 特性

2.1.原子性

即不可分割性,事务要么全部被执行,要么就全部不被执行。

2. 2. 一致性或可串性

事务的执行使得数据库从一种正确状态转换成另一种 正确状态

2.3. 隔离性

在事务正确提交之前,不允许把该事务对数据的任何改变提供 给任何其他事务

2.4. 持久性

事务正确提交后,其结果将永久保存在数据库中,即使在事务 提交后有了其它故障,事务的处理结果也会得到保存

3.事务并发带来的问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来 完成各自的任务(多个用户对同一 数据进行操作).并发虽然是必须的, 但可能会导致以下的问题。

3.1. 脏读 (Dirty read)

当一个事务正在访问数据并且对数据进行了修改, 而这种修改还没有提交到数据库中,这时另外一个事务也访问了这 个数 据,然后使用了这个数据.因为这个数据是还没有提交的数据,那么另 外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能 是不正确的。

3.2.丢失修改(Lost to modify)

指在一个事务读取一个数据时,另外一 个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第 二 个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因 此称为丢失修改。

3.3. 不可重复读(Unrepeatableread)

指在一个事务内多次读同一数据。 在这个事务还没有结束时,另一个事务也访问该数据。那么,在第 一个 事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次 读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是 不一样的情况,因此称为不可重复读。

3.4.幻读(Phantom read)

幻读与不可重复读类似。它发生在一个事务

( T1)读取了几行数据,接着另一个并发事务( T2)插入了一些数据 时。在随后的查询中,第一个事务( T1)就会发现多了一些原本不存在 的记录,就好像发生了幻觉一样,所以称为幻读。

3.5. 不可重复读和幻读区别

不可重复读的重点是修改,比如多次读取一 条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如 多次读取一条记录发现记录 增多或减少了

4.事务的隔离级别

4.1.READ-UNCOMMITTED( 读取未提交 )

最低的隔离级别,允许读取尚未提交 的数据变更,可能会导致脏读、幻读或不可重复读。

4.2.READ-COMMITTED( 读取已提交 )

允许读取并发事务已经提交的数据,可 以阻止脏读,但是幻读或不可重复读仍有可能发生。

4.3.REPEATABLE-READ( 可重复读 )

对同一字段的多次读取结果都是一致 的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻 读仍有可能发生。

4.4.SERIALIZABLE( 可串行化 )

最高的隔离级别,完全服从 ACID 的隔离级 别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就 是说,该级别可以防止脏读、不可重复读以及幻读。

5.什么是分布式事务

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性

6.为什么使用分布式事务

image.png
image.png

7.如何解决分布式事务的问题

使用消息中间件

手写代码解决分布式事务

使用第三方组件--->Seata阿里巴巴的产品

8.seata

Seata部署指南

8.1.什么是seata

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

image.png

8.2.Seata的执行流程

1.A服务【订单微服务】的TM[事务发起者]向TC[seata服务端]申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID

2.A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播

3.B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖

4.B服务执行分支事务,向数据库做操作

5.全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚

6.TC协调其管辖之下的所有分支事务, 决定是否回滚

image.png
TM:事务发起者【在哪个方法上添加了全局事务注解的】
TC : 事务管理器【seata的服务端】
RM: 每个操作数据库的微服务
TID: 全局事务id
TM和RM都属于微服务代码
TC: seata服务器。

9.搭建seata服务器

9.1.查看版本--版本要对应

image.png

9.2.下载seata1.3.0

因为我springcloud使用的是2.2.3

image.png
image.png

找对应的版本

image.png

9.3.解压

image.png

9.4.修改conf/file.conf

seata默认保存到本地中,以后会有seata集群,得让seata信息可以共享,我们应该修改它的保存位置:

image.png
image.png

serverTimezone这个是正确的

9.5.拉取mysql的驱动

image.png
image.png

9.6.创建数据库并导入表结构

image.png

seata部署指南中
image.png
image.png
image.png
image.png
image.png

可以直接下载将scipt放到senta中

image.png
image.png
image.png

9.7.指定seata的注册中心地址和配置中心的内容

image.png
image.png
image.png
image.png

9.8.需要把哪些配置项放入nacos配置中心

image.png

9.8.1.修改储存方式

image.png
image.png

9.8.2.修改自己的MySQL

image.png

注意里面的serverTimezone这个是正确的

9.8.3.修改组名

image.png
image.png

9.9.使用nacos/nacos-fonfig.sh 把配置信息放入nacos配置中心

image.png

使用git打开nacos-config.sh

image.png

9.10.指定nacos配置中心的地址

image.png

9.11.访问一下自己nacos

image.png

10.配置微服务客户端

10.1.在每个数据库中创建unlog表

image.png
image.png
image.png

10.2.在每个微服务中添加seata依赖

<!--seata 一定要保证和seata服务的版本匹配-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

10.2.1.查看一下自己的版本

image.png

10.3.修改每个微服务的配置文件

#指定seata分组名称--组名必须和config.txt文件中的分组名字一致
 alibaba:
 seata:
 tx-service-group: guangzhou
#指定seata服务器在nacos的注册中心的地址
seata:
 registry:
    #类型是nacos
 type: nacos
    #指定nacos的地址
 nacos:
 server-addr: localhost:8848
      #指定nacos的账号和密码
 username: nacos
 password: nacos
      #组名--默认是SEATA_GROUP--可以不写
 group: DEFAULT_GROUP
      #指定seata服务器在注册中心的服务名称--默认seata-server
 application: seata-storage
  #指定配置的类型--配置中心
 config:
 type: nacos
 nacos:
 server-addr: localhost:8848
 username: nacos
 password: nacos
 group: SEATA_GROUP

10.4.设置事务发起者

image.png

10.5.启动seata

image.png

10.6.测试

image.png
image.png
image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容