我是猿人,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!
写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!
用知识改变命运,让家人过上更好的生活,互联网人一家亲!
---公众号「猿码天地」
Java知识学堂:https://gitee.com/zhangbw666/it-knowledge
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。——《写给程序员朋友》
作者 | 茶底世界
来源 | urlify.cn/Bv6Bjy
在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 。其实就可以简单理解成在分布式系统中实现事务。
一个简单的例子,电商系统中,下单接口,一般会有扣库存,扣积分,然后生成订单。而一般来说,这三个系统都是不同的服务,我们本地不能控制其他服务的事务,此时如果订单服务发生了错误进行了回滚,但远程的服务,如扣库存已经调用完成,不能进行回滚了。也就是说下单接口的成功与否,不仅取决于本地的 db 操作,而且依赖第三方系统的结果, 这时候分布式事务就保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
在讲分布式事务之前,先回顾下本地事务的知识点。
一、本地事务
严格意义上的事务实现应该是具备原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持久性(Durability),简称 ACID。
-
原子性:一系列操作整体不可拆分,要么都执行,要么都不执行。
-
一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态
-
隔离性:事务之间相互隔离, 指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
-
持久性:一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中
通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败。
隔离性中还有一个隔离级别的概念,总共有4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未提交读,已提交读, 可重复读,串行化。这里面又牵扯到三个概念,脏读、不可重复读 ,幻读,我们先理解这三个概念
-
脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据
-
不可重复读:当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配
-
幻读:当前事务读第一次取到的数据比后来读取到数据条目少
而事务的隔离级别其实就是如何避免这三种
-
未提交读:该隔离级别允许脏读取,其隔离级别最低,也就是啥都没避免。
-
已提交读 :一个事务可以读取已提交的事务,保证了一个事务不会读到另一个并行事务已修改但未提交的数据。但是不保证可重复读,也就是不保证多次读取数据都相同。
-
可重复读:保证多次读取一个数据时都跟开始读取的时候一样, 因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻读数据。
-
串行化:是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。该隔离级别能防止脏读、不可重复读、幻读。
Mysql默认级别是可重复读,在编写代码时是可以进行设置的。
而在Spring中七种事务传播行为事务的传播行为概念:
-
PROPAGATION_