提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、分布式事务是什么?
由于项目业务模块多,利用微服务架构将项目进行模块拆分,部署到不同机器节点中。由于在这个过程中数据库也进行了拆分,就会涉及到跨数据库的数据一致性问题,我们就需要分布式事务来解决。
二、CPA原则
一致性
当一个节点写数据库时,其他节点立刻能获取到最新状态的数据。
可用性
任何时刻,用户都可以获取正常的请求响应,而不会出现浏览器错误等情况。
分区容错性
当某个模块间的网络通信出现问题时,不会影响其他模块的正常工作,允许错误发生,但系统不会崩溃,仍然能继续运行。
三、常用方法
1、两阶段提交
(1)准备阶段:事务协调器向各个参与者发送准备信息,收到消息后参与者试着执行事务,如果遇到权限验证失败等问题直接返回失败;如果没有遇到错误,则在本地执行事务,写redo和undo log文件,但不提交。
(2)提交阶段;如果事务提交者收到了参与者的失败信息,则向所有参与者发送回滚信息;否则,发送提交信息。参与者根据收到的信息执行相应操作,完毕后释放执行事务期间占有的所有锁资源。
2、三阶段提交
(1)can commit:协调者向参与者发送commit请求,参与者判断自身是否能顺利地完成事务,将判断结果反馈给协调者。
(2)准备提交阶段pre commit:如果有参与者判断结果为no时,协调者就向各参与者发送中断事务信息;
否则,协调者向各参与者发送准备提交信息,各事务开始执行事务,写redo log和undo log文件,如果执行成功,向协调者发送ack响应。
(3)执行提交阶段:当协调者收到所有参与者的ack响应时,就向各参与者发送提交事务信息,参与者提交事务后,向协调者发送ack,至此事务执行完成;
当有参与者没有向协调者发送ack响应时,协调者就会向各参与者发送回滚信息,执行回滚操作。
3、2pc和3pc的不同
3pc添加了一个预准备阶段,可以使协调者更早地意识到系统中存在地问题,减少阻塞时间。(参与者首先会检查自己本地的资源状态,包括数据库、文件系统等。它会确认是否有足够的资源和权限来执行该事务。如果发现资源不足或者权限不符合要求,参与者会拒绝执行事务。)