分布式事务解决方案
单库事务:直接使用数据库事务解决
分布式事务:需要操作多个数据库,单库事务无法解决
分布式事务解决方案:两阶段协议、三阶段协议、tcc协议、mq等
************************
两阶段协议
说明:c表示事务协调者,p表示事务参与者
操作过程
阶段1:协调者向参与者发送事务提交请求,请求者在本地日志redo、undo中记录提交回滚信息,并向协调者返回响应信息;
阶段2:协调者根据各参与者的响应信息决定提交还是回滚事务,如果参与者都返回yes则提交事务,若有一个返回no则回滚事务
两阶段提交缺点
同步阻塞:阶段1中参与者接到事务提交请求,向协调者返回响应信息后就进入阻塞状态,直到阶段2接到协调者的提交或者回滚请求才解除阻塞
单点故障:协调者出现故障则整个事务不能正常执行
数据一致性:在阶段2协调者发出部分commit请求后故障,或者由于网络故障部分commit请求无法送达,则部分参与者提交,部分无法提交造成数据不一致
************************
三阶段协议
操作过程
阶段1:协调者向参与者发出cancommit请求,询问事务是否可以提交,参与者返回响应信息;
阶段2:如果参与者都返回yes,协调者发出事务预提交请求precommit,参与者返回事务执行状态;如果第一阶段有参与者返回no,协调者中断事务;
阶段3:第2阶段参与者返回的响应都为yes,协调者发出事务提交请求,否则发出事务回滚请求,参与者返回请求执行状态
三阶段协议是两阶段协议的改进版,减少了事务阻塞范围,但仍有一些缺点:
单点故障:协调者故障则事务操作不能正常执行
数据一致性:参与者第2阶段返回响应后,若出现网络分区,导致参与者不能接到第3阶段协调者的提交或者回滚请求,则在超时后事务仍会提交,可能会造成数据不一致
************************
tcc 协议
操作过程
try:服务a开启事务,调用其他服务的业务接口,各服务向事务协调器返回执行状态;
confirm:如果事务协调器接收的状态都为yes,则协调器发出事务提交请求;
cancel:如果服务执行失败返回状态no,则协调器发出事务回滚请求,取消事务
tcc协议缺点:会对业务造成倾入、实现难度较大
************************
mq 消息中间件
可以使用消息中间件(如rocketmq、kafka等)发送事务消息来实现事务相关操作