事务简介:
事务是访问并可能更新数据库中各种数据项的一个程序执行单元。事务具有4个属性:原子性、一致性、隔离性、持久性,简称ACID
本地事务:
一般应用程序只操作单一的数据库,此种情况下的事务称为本地事务,本地事务的ACID特性由数据库直接提供支持。
分布式事务:
大部分互联网公司都进行了数据库拆分和服务化,次种情况下,完成某一个业务功能可能需要横跨多个服务,操作多个数据库,这些都涉及到了分布式事务。分布式事务就是为了保证不同资源服务器的数据一致性。有如下几种场景:
1、跨库事务:某功能需要操作多个库;
2、分库分表:数据量比较大时,都会进行水平拆分;
3、服务化:微服务架构,某个功能需要多个服务共同完成,是分布式事务最典型的场景;分布式事务在保证ACID特性的同时,还必须考虑性能问题。
DTP模型:
X/Open即open group是一个独立的组织,主要负责制定各种行业技术标准。分布式事务处理DTP(Distributed Transaction Processing);
DTP模型的5个基本元素:
应用程序(AP,Application Program)
资源管理器(RM,Resource Manager)
事务管理器(TM)
通信资源管理器(CRM)
通信协议(CP)
XA规范:
定义了RM-TM的交互接口,及对两阶段提交协议进行了优化
两阶段提交协议(2PC):
字面理解,将提交过程划分为2个阶段:
阶段1:TM通知各RM准备提交她们的事务分支;以mysql数据库为例,第一阶段,事务管理器向所有涉及到的数据库服务器发出prepare“准备提交”请求,数据库收到请求后执行数据修改和日志记录等处理,处理完成后只是把事务的状态改成“可以提交”,然后把结果返回给事务管理。
阶段2:TM根据阶段1各RM prepare的结果,决定是提交还是回滚事务;以mysql数据库为例,如果第一阶段中所有数据都prepare成功,那么事务管理器向数据库服务发出“确认提交”请求,数据库服务把事务的“可以提交”状态改为“提交完成”状态,然后返回应答。如果阶段1有任何一个数据库操作发生了错误,或者事务管理器收不到某个数据库的回应,则认为事务失败,回撤所有数据库的事务。数据库服务器收不到第二阶段的确认提交请求,也会把“可以提交”的事务回撤。
XA是资源层面的分布式事务,强一致性,在两阶段提交整个过程中,一直会持有资源的锁。
TCC是业务层面的分布式事务,最终一致性,不会一直持有资源锁。
分布式事务不可能100%解决,只可能尽量提高成功概率,比如99.99%;
两阶段提交协议(2PC)存在的问题:
1、同步阻塞:使用mysql来支持XA分布式事务的话,最好事务隔离级别设置为SERIALIZABLE,是隔离级别最高的,也是执行效率最低的。
2、单点故障:协调者单点故障;
3、数据不一致:第二阶段当协调者向参与者发送commit请求后,发生了局部网络异常或者协调者发送了故障,会导致只有一部分参与者接收到了commit请求,其他部分未接收到commit请求无法提交事务,于是整个分布式事务出现了数据不一致。
三阶段提交协议(3PC):
三阶段提交(3PC)是二阶段提交(2PC)的改进版本;
与两阶段提交不同的是,三阶段提交有两个改动点:
1、引入超时机制,同时在协调者和参与者中都引入了超时机制;
2、在第一阶段和第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。
2PC 和 3PC的区别
相比2PC,3PC主要解决了单点故障及减少了阻塞;无论二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题。