分布式学习-1 分布式事务解决方案

1.分布式事务产生背景

一般情况下提到的事务都是数据库事务,事务是运行在数据库上的运行单元。

数据库事务满足ACID特性:

A(Atomic原子性):事务必须是原子的工作单元,整个操作要么成功要么失败。

C(Consistent一致性):事务在完成的时候必须保证所有数据的状态是一致性的,例如转账前后的总额不能改变。

I(Isolation隔离性):并发事务所做的修改必须和其他事务所做的修改是隔离的。

D(Duration持久性):事务完成之后对系统的影响是永久性的。

 原子性和隔离性导致事务执行的代价远高于非事务的代价,一般隔离性是通过锁来实现的,其他三个特性一般是通过事务日志实现的,IO操作。

mysql中的事务处理过程:redo和undo文件,redo是记录事务修改之后的数据,undo是记录事务修改之前的数据。

事务在commit之前做的操作:

(1)记录redo和undo文件,确保日志在磁盘上的持久化

(2)更新数据记录

(3)提交事务:redo写入commit记录

-->zk中的数据的一致性有涉及到事务

分布式事务产生的原因:

(1)数据库分库分表(更新数据和新增数据)

(2)SOA化:(单机支撑的系统做了一个拆分,拆分,例如电商系统做拆分,拆分成用户中心(userDB),库存中心(repoDB),订单中心(orderDB),商品中心(productDB))

例如:下订单需要扣除库存,保证更新订单状态,但是两个db而且应用部署到不同的服务器,但是还需要保证原子性,那么就是分布式事务。

2.X/OpenDTP事务模型

全称:Distributed Transaction Processing Reference Model

X/Open是一个组织机构,定义出的一套分布式事务标准,定义了规范的API接口。

2PC(Two Phase Commitment Protocol)用来保证分布式事务的完整性。

J2EE遵循了X/OpenDTP规范,设计并实现了java里面的分布式事务编程接口规范。

XA是X/OpenDTP定义的中间件与数据库之间的接口规范。XA接口函数由数据库厂商提供。

X/OpenDTP角色:

AP : application program表示应用节点

RM:resources manager 表示资源管理器,可认为是数据库

TM : transaction manager 事务管理器,事务协调者,确保事务正常完成

2PC(two-phase-commit):

 

(CAP:分布式系统的不可靠理论)

TM为了避免不可靠因素,TM实施了两步提交的方案:

阶段一:提交事务请求(可理解成投票阶段)

(1)TM向所有的AP发送事务内容,询问是否可以执行事务的提交操作,并等待各个AP响应

(2)执行事务

 各个AP节点执行事务操作(并不是真正意义上的提交事务,而是将undo和redo信息记录到事务日志中,尽量把提交过程中所消耗时间的操作和准备都提前完成后确保后续事务提交的成功率)

(3)各个AP向TM反馈事务询问的响应

各个AP成功执行了事务操作,那么反馈给TM yes的response,如果AP没有成功执行事务,就反馈TM no的response

阶段二:执行事务提交

(1)执行提交事务:

当所有的参与者返回yes的时候,TM发送commit请求,只要任何一个返回no,那么TM就会认为这个事务需要回滚。如果是中断的话,TM发送3.abort请求。

假设一个事务的提交过程需要30s,其中prepare操作需要28s(事务日志落地磁盘及各种io操作)那么commit阶段发生错误的概率和prepare相比2/28<10%,只要第一阶段成功commit失败的概率会很小;

(2)中断事务提交:

 

2PC存在的问题:

)(1)数据一致性

但是仍然会产生数据一致性问题:当一个参与者和协调者都挂掉的时候,挂掉的参与者在挂掉之前执行了一个操作(commit或者abort)或者并没有接收到一条指令或者接收到的指令还没来得及操作,那么选一个新协调者会询问所有参与者的情况,其他两个参与者执行了commit操作,但是如果挂掉的参数者之前执行的是abort或者并没有执行操作,就会出现数据不一致。

(2)同步阻塞

协调者发送请求后等待响应,参与者返回yes之后,等待协调者再次发送commit或者abort请求,当TM挂掉的时候,所有的参与者都同步阻塞了。

3PC(three-phase-commit)

阶段一:canCommit  增加一个TM向发送者发送一个请求确认发送者是否可以接收这个事务

阶段二:preCommit  当收到第一阶段的反馈,可以执行第一阶段的操作,那么TM发送preCommit

阶段三:doCommit   分两种情况commit或者abort

3PC解决了阻塞:增加第一阶段的好处就是,询问了各个阶段是否能够执行,超时机制,当参与者一直不返回yes的时候,协调者不去commit,增加了可靠性

zk中如何解决数据一致性问题?多阶段提交的方式。

3.分布式事务的实现

JOTM(java open transaction manager)

Atomikos(开源)

以下说明为Atomikos实现:

用户通过web去调用order和user服务,假设在order里面写一条记录,user中更新一条积分引入dubbo其实就是分布式事务的实现;

项目中涉及到分布式事务的配置:

 

posted on 2018-09-12 14:27  companion  阅读(276)  评论(0编辑  收藏  举报