分布式事务

createh51个月前 (03-18)技术教程5

1、两阶段提交协议

分为两个阶段:一个准备阶段 ,一个提交阶段。基于两阶段协议,事务管理器能够最大限度地保证跨数据库操作的事务原子性,是分布式系统环境下最严格的事务实现方法。但是两阶段协议存在性能方面问题,难于进行水平伸缩,因为在提交事务过程中,事务管理器需要每个参与者进行准备和提交的操作协调,在准备阶段锁定资源,在提交阶段消费资源。由于参与者众多,锁定资源和消费资源之间的时间差被拉长,导致响应速度较慢,产生死锁或不确定结果的可能性较大。在互联网很少使用两阶段提交协议。

两阶段提交协议是阻塞协议,在极端情况下不能快速响应请求方,因此提出了三阶段提交协议,解决了两阶段提交协议的阻塞问题,但仍然需要事务管理器在参与者之间协调,才能完成一个分布式事务。


2、最大努力保证模式

这是一种非常通用的保证分布式一致性的模式,很多开发人员一直在使用,但是未认识到这是一种模式,最大努力保证模式适用于对一致性要求并不十分严格但是对性能要求较高的场景。

具体的实现方式是:在更新多个资源时,将多个资源的提交尽量延后到最后一刻处理,如果业务流程出现问题,则所有的资源更新都可以回滚,事务仍然保持一致。唯一可能出现问题的是在提交多个资源时发生了系统问题,比如网络问题等。但是这种情况是非常罕见的,一旦出现这种情况,就需要进行实时补偿,将已提交的事务进行回滚。 当然在使用这种模式时,我们要考虑每个资源的提交顺序。我们在生产实践中遇到的一种反模式,就是在数据库事务中嵌套远程调用,而且远程调用的是耗时任务,导致数据库事务被拉长,最后拖垮数据库。

3、事务补偿机制

在对性能要求很高的场景中,两阶段提交协议不是一种好方案,最大努力保证模式也会使多个分布式操作相互嵌套,有可能相互影响。这里我们给出事务补偿机制,其性能很高,并且能尽最大可能地保证事务的一致性。

在数据库分库分表后,如果涉及的多个更新操作在某一个数据库范围内完成,则可以使用数据库内的本地事务保证一致性。对于跨库的多个操作,可通过补偿和重试,使其在一定的时间窗口内完成操作,这样就可以实现事务的最终一致性,突破事务遇到问题就回滚的传统思路。 如果采用事务补偿机制,则在遇到问题时,需要记录遇到问题的环境、信息、步骤、状态等,后续通过重试机制使其达到最终一致性。

相关文章

完美避坑!记一次Elasticsearch集群迁移架构实战

前言Elastic自身设计了集群分片的负载平衡机制,当有新数据节点加入集群或者离开集群,集群会自动平衡分片的负载分布。需求背景公司原有大数据平台基于公有云构建,由于种种原因,现在需要迁移到自建机房,E...

好程序员Java教程分享Java技术知识点总结

  好程序员Java教程分享Java技术知识点总结,零基础怎么学Java?下面就一起来看看面试中常见基础Java技术知识点总结。  第一,主要是Java环境变量的配置。搭建好环境才能干活。要理解什么是...

Java面试场景题及答案最全总结(2025版持续更新)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:并发编程、Web、SpringBoot、MySQL、Linux、Spr...

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享

如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享在高流量场景下。首先,我需要回忆一下常见的优化策略,比如负载均衡、缓存、数据库优化、微服务拆分这些。不过,可能还需要考虑用户的具体情况,比...

# 深入浅出:Java库的使用与案例分享

在我的Java学习旅程中,我发现**Java库**是提升编程效率和代码质量的重要工具。今天,我们将一起探讨Java库的基本概念、常用库的介绍以及一些实际的使用案例。无论你是初学者还是爱好者,了解这些内...

又欲又撩人,2023年最新Java教程打包分享~~

Java 是由 Sun 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台的总称。Java 是一门面向对象编程语言,不仅吸收了 C/C++ 语言的各种优点,还摒弃了 C/C+...