本文主要是介绍微服务实战(十三)初探微服务分布式事务 - Seata AT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本章主要内容
本章我们主要了解一下分布式事务的概念、目前市面上的解决方案、以及在微服务中如何实现分布式事务。
什么是事务,什么是ACID
首先,提到分布式事务,咱们得明白什么是事务(Transaction),百科的链接放这里咯,事务应该具有4个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。这四个属性通常称为ACID特性。
举例:我们把这件事看做一个事务:“张三有300元,李四有500元,张三转账100给李四,李四又转回50给张三,最后张三有250元,李四有550元” 。
原始状态--张三有300元,李四有500元
操作--张三转账100给李四,李四又转回50给张三
结果--张三有250元,李四有550元
原子性 atomicity: 一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。即“张三转账100给李四,李四又转回50给张三”这套操作,要么全做,要么不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。实际上跟原子性是同一回事,只不过从不同角度来看,一致性是从结果的角度出发,即如果“操作”发生,那么“结果”就是“张三有250元,李四有550元”,而如果不发生,则“结果”是 “张三有300元,李四有500元”,在这件事上,不允许出现其他“结果”。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 在我们这个事务中,假如在做“张三转账100给李四,李四又转回50给张三” 这个过程中,突然有个王五给张三转了100元,那么就干扰了我们这个事务的结果,在数据库中,通过锁机制来让有资源冲突的事务不能并行,即王五的转账必须等我们当前这个事务执行完有结果后才能开始。
持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 按照字面就很好理解了,我们对数据进行改变后,就保存了,除非有其他正常操作来改变这个值,不然这个值就永久不变了。
什么是分布式事务
- 刚性事务:遵循ACID原则,强一致性。
- 柔性事务:遵循BASE理论,最终一致性;与刚性事务不同,柔性事务允许一定时间内,不同节点的数据不一致,但要求最终一致。
分布式事务是指在分布式的环境下实现事务(目前主要是讲柔性事务),那什么是分布式环境呢?即跨服务器、跨数据库的环境,比如之前提到的示例,非分布式事务(本地事务)可以看成整个示例在同一个数据库里执行,而分布式环境下,可能不同用户的余额按照规则被放到不同的数据库里,可能交易服务器和账户服务器也不在同一个服务器中。
本地事务的实现逻辑是这样的: 库A 开启事务-->库A "张三转账100给李四" -->库A 提交/回滚事务
而到了分布式环境
这篇关于微服务实战(十三)初探微服务分布式事务 - Seata AT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!