关于分布式事务之2PC(两阶段提交)
概念:
2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commitphase),2是指两个阶段,P是指准备阶段,C是指提交阶段。
运行过程
-
准备阶段:事务协调者询问参与者事务是否执行成功,参与者返回事务执行结果,此时事务并未提交。
-
提交阶段:若所有参与者事务都执行成功,则事务协调者通知参与者事务提交事务;否则,事务协调者通知参与者回滚事务。
XA接口规范协议
XA接口规范协议是一个分布式事务协议,它的基础是两阶段提交协议(2PC)。
XA中大致分为两部分:事务管理器和本地资源管理器。
本地资源管理器往往由数据库实现,几乎所有商业OLTP(联机事务处理)数据库都支持XA协议,实现了XA接口。
-
本地资源管理器往往由数据库实现,几乎所有商业OLTP(联机事务处理)数据库都支持XA协议,实现了XA接口。
-
事务管理器(即事务协调者Coordinator)作为全局的调度者,负责各个本地资源的提交和回滚;事务管理器一般由应用框架实现,如Java的Atomikos TransactionsEssentials
举个例子:
老王的老婆要炒菜,叫老王去买锅,叫儿子去买菜。
在2PC实现的情况下:
- 老王去超市拿了个锅,先打电话告诉老婆说有锅了,然后走到柜台,堵着收银员就不结账,也不让其他人先结账,说是在等老婆电话通知结账。
- 儿子去超市买了个菜,先打电话告诉老妈说有菜了,走到另一个柜台,堵着收银员也不结账,也不让其他人先结账,说是在等老妈电话通知结账。
- 如果老婆接到老王和儿子电话,确认锅和菜都有了,那么就通知两个人都结账,分布式事务成功,皆大欢喜。
- 如果老婆接到老王和儿子电话,发现锅和菜其中有一个买不到,那么菜炒不成了,就通知两个人都不要结账,东西哪里拿的就放回哪里,分布式事务失败,操作回滚。
在2PC中出现单点问题:
- 假设当前与理想情况下第1步相同。
- 假设当前与理想情况下第2步相同。
- 嘿嘿,此时隔离老李来串门,叫老王的老婆去他家吃饭,老王的老婆一口答应就去了,而且手机也不带,那么老王的老婆就没办法通知老王和儿子结账,老王和儿子就一直堵着收银台。
总结:
缺点:
- 同步阻塞:所有事务参与者在等待其他参与者响应的时候都处于同步阻塞的状态,无法进行其他操作,即资源锁定时间太长。
- 单点问题:协调者在2PC中起到非常大的作用,若发生故障将会造成严重影响。特别是在第二阶段发生故障,所有参与者会一直处于等待状态,无法进行其他操作。
- 一致性问题:在第二阶段,若协调者只发送了部分Commit消息,此时网络发生异常,那么只有部分事务参与者接收到Commit消息,也就是说只有部分参与者提交了事务,那么会使系统数据不一致。
- 容错问题:任意一个节点失败则会导致整个事务失败,容错机制较低。
- 可用性:牺牲了可用性,对性能影响较大,不适合高并发的场景。
优点:
使用分布式事务的成本较低。在一致性上选择了尽量向实时一致性靠拢。