本文作者:罗海鹏,叩丁狼高级讲师。原创文章,转载请注明出处。
前言
工欲善其事必先利其器,既然我们决定要做一个分布式事务框架,那首先需要了解一下,分布式事务是怎么回事,它跟传统的本地事务有什么区别,解决方案有哪些,每种解决方案的对比等等。
本地事务
在了解分布式事务之前,先回顾一下本地事务,顾名思义,本地事务就是在同一个JVM中,一个开启了事务的业务方法就是本地事务。而这一个开启了事务的业务方法里面的操作要么全部执行成功,要么全部执行失败,不允许只成功一半另外一半执行失败的事情发生。例如该业务方法中,有两次数据库更新操作,那么这两次数据库操作要么全部执行成功,要么全部回滚。使用专业术语来讲的话,就是事务的4个基本特性:Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durablity(持久性),统称ACID,这里简单的对ACID做一个概念的说明,当作是做个笔记:
- Atomicity(原子性)
是指事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。通俗的说,就是所有操作要么全部成功,要么全部失败回滚。 - Consistency(一致性)
是指事务执行前后,数据从一个状态到另一个状态必须是一致的,比如A向B转账(A、B的总金额就是一个一致性状态),不可能出现A扣了钱,B却没收到的情况发生。 - Isolation(隔离性)
是指当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。这里涉及到数据库的隔离级别的概念,不是我们讨论的主题,不详细展开,大家可以自行查阅相关资料。 - Durablity(持久性)
是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
分布式事务
通过以上的回顾我们知道,本地事务对于我们来说不是什么问题,因为我们可以直接使用数据库的事务支持,比如mysql、oracle这些数据库对事务都有很好的支持。但是,对于分布式应用来说的话,事务就没有那么简单了,因为需要开启事务的业务方法,很可能是分布在不同应用程序中,这就说明,大家不在同