SpringBoot分布式事务解决方案之Seata(面试精华)
最近在面试过程中,经常遇到高频问题,分布式事务解决方案。然后劈里啪啦的扯了一大堆。就此,给出几个关键性概念。1.什么是事务。什么是事务?举个生活的例子 :你去小卖部买东西,“一手交钱,一手交货“就是一个事务的例子,交钱和交货必须全部成功,事务才算成功,任一个活动失败,事务将撤销所有已成功的活动。明白上述例子,再来看事务的定义 :事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功
最近在面试过程中,经常遇到高频问题,分布式事务解决方案。然后劈里啪啦的扯了一大堆。就此,给出几个关键性概念。
1.什么是事务。
什么是事务?举个生活的例子 :你去小卖部买东西,“一手交钱,一手交货“就是一个事务的例子,交钱和交货必须全部成功,事务才算成功,任一个活动失败,事务将撤销所有已成功的活动。
明白上述例子,再来看事务的定义 :
事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。
2.什么是本地事务。
在计算机系统中,更多的是通过关系型数据库来控制事务,这里利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。
回顾一下数据库事务的四大特性ACID:
A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。
C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如 :张三向李四转100元,转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出100元,李四账户没有增加100元这就出现来数据错误,就没有达到一致性。
I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态。通过配置事务隔离级别可以避免赃读、重复读等问题。
D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。
数据库事务在实现时会将一次事务涉及的操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚。
3.什么是分布式事务。
随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,下图描述来单体应用向微服务的演变:
分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。
4.Seata 是什么?
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。
截至目前,最佳解决分布式事务方案非seata莫属。
最简洁的注释。@GlobalTranscation
5.两阶段提交(2PC)
两阶段提交又称2PC(two-phase commit protocol),2pc是一个非常经典的强一致、中心化的原子提交协议。这里所说的中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和N个参与者节点(partcipant)。
准备阶段:事务协调者,向所有事务参与者发送事务内容,询问是否可以提交事务,并等待参与者回复。事务参与者收到事务内容,开始执行事务操作,讲 undo 和 redo 信息记入事务日志中(但此时并不提交事务)。如果参与者执行成功,给协调者回复yes,表示可以进行事务提交。如果执行失败,给协调者回复no,表示不可提交。
提交阶段:如果协调者收到了参与者的失败信息或超时信息,直接给所有参与者发送回滚(rollback)信息进行事务回滚,否则,发送提交(commit)信息。参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。(注意:必须在最后阶段释放锁资源) 。
6.redo log的文件和undo log文件的区别
当事务发生异常或显式回滚时,使用undo log回滚数据,即:存储的数据是修改或删除之前的数据,其数据类型以二进制blob类型存在,当回滚完成或者程序结束时,自动释放。
redo log当然存储的是修改或者删除之后的数据啦。redo log不是随着事务提交才写入文件的,而是从事务开始就逐步写入文件了(即使事务还没提交)
更多推荐
所有评论(0)