`
thinkerAndThinker
  • 浏览: 284810 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库分库分表(sharding)系列(四) 多数据源的事务处理

 
阅读更多

系统经sharding改造之后,原来单一的数据库会演变成多个数据库,如何确保多数据源同时操作的原子性和一致性是不得不考虑的一个问题。总体上看,目前对于一个分布式系统的事务处理有三种方式:分布式事务、基于Best Efforts 1PC模式的事务以及事务补偿机制。我们下面对这三种处理方式一一进行分析。本文原文链接:http://blog.csdn.net/bluishglc/article/details/7793172 转载请注明出处!

分布式事务

这是最为人们所熟知的多数据源事务处理机制。本文并不打算对分布式事务做过多介绍,读者可参考此文:关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 。在这里只想对分布式事务的利弊作一下分析。

优势:

1. 基于两阶段提交,最大限度地保证了跨数据库操作的“原子性”,是分布式系统下最严格的事务实现方式。
2. 实现简单,工作量小。由于多数应用服务器以及一些独立的分布式事务协调器做了大量的封装工作,使得项目中引入分布式事务的难度和工作量基本上可以忽略不计。

劣势:

系统“水平”伸缩的死敌。基于两阶段提交的分布式事务在提交事务时需要在多个节点之间进行协调,最大限度地推后了提交事务的时间点,客观上延长了事务的执行时间,这会导致事务在访问共享资源时发生冲突和死锁的概率增高,随着数据库节点的增多,这种趋势会越来越严重,从而成为系统在数据库层面上水平伸缩的"枷锁", 这是很多Sharding系统不采用分布式事务的主要原因。


基于Best Efforts 1PC模式的事务

与分布式事务采用的两阶段提交不同,Best Efforts 1PC模式采用的是一阶段端提交,牺牲了事务在某些特殊情况(当机、网络中断等)下的安全性,却获得了良好的性能,特别是消除了对水平伸缩的桎酷。Distributed transactions in Spring, with and without XA一文对Best Efforts 1PC模式进行了详细的说明,该文提供的Demo代码更是直接给出了在Spring环境下实现一阶段提交的多数据源事务管理示例。不过需要注意的是,原示例是基于spring 3.0之前的版本,如果你使用spring 3.0+,会得到如下错误:java.lang.IllegalStateException: Cannot activate transaction synchronization - already active,如果使用spring 3.0+,你需要参考spring-data-neo4j的实现。鉴于Best Efforts 1PC模式的性能优势,以及相对简单的实现方式,它被大多数的sharding框架和项目采用。

事务补偿机制

对于那些对性能要求很高,但对一致性要求并不高的系统,往往并不苛求系统的实时一致性,只要在一个允许的时间周期内达到最终一致性即可,这使得事务补偿机制成为一种可行的方案。事务补偿机制最初被提出是在“长事务”的处理中,但是对于分布式系统确保一致性也有很好的参考意义。笼统地讲,与事务在执行中发生错误后立即回滚的方式不同,事务补偿是一种事后检查并补救的措施,它只期望在一个容许时间周期内得到最终一致的结果就可以了。事务补偿的实现与系统业务紧密相关,并没有一种标准的处理方式。一些常见的实现方式有:对数据进行对帐检查;基于日志进行比对;定期同标准数据来源进行同步,等等。

小结

 

分布式事务,最严格的事务实现,但性能是个大问题;Best Efforts 1PC模式,性能与事务可靠性的平衡,支持系统水平伸缩,大多数情况下是最合适的选择;事务补偿机制,只能适用于对事务性要求不高,允许数据“最终一致”即可的系统,牺牲实时一致性,获得最大的性能回报。

分享到:
评论

相关推荐

    分库分表,多数据源的切换

    5. **分布式事务支持**: 虽然MySQL等数据库本身支持分布式事务,但在分库分表场景下,Sharding-JDBC提供分布式事务解决方案,如基于X/Open XA的分布式事务和柔性事务。 在实际使用Sharding-JDBC进行多数据源切换时...

    数据库+分库分表+sharding-jdbc

    数据库分库分表是应对大数据量、高并发访问场景下的重要解决方案,旨在提高数据库系统的性能和可扩展性。Sharding-JDBC是阿里巴巴开源的一款轻量级的Java框架,用于实现数据库的水平拆分,它是基于JDBC的中间件,...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    在现代企业级应用开发中,数据量的增长往往超出单个数据库的处理能力,这时就需要采用分库分表的技术来提高系统的扩展性和性能。本项目基于Java、SpringBoot、MyBatis以及ShardingJDBC实现了一个分库分表的解决方案...

    sharding分库分表demo

    在分库分表的场景下,ShardingSphere能够根据预定义的规则将数据分散到多个数据库和表中,以实现水平扩展,提高数据库处理能力。它支持自定义分片策略,例如根据用户ID取模、时间戳范围等方式,使得数据分布均匀,...

    mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip

    这个"mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip"压缩包提供的就是一个使用Sharding-JDBC进行数据库分库分表的示例项目。 Sharding-JDBC的工作原理是通过透明化的JDBC层,将数据路由、分片规则、读写分离...

    分库分表shardingjdbc

    ### 分库分表shardingjdbc知识点详述 #### 一、简介 Apache ShardingSphere 是一个分布式的数据库中间件项目,旨在提供简单易用、高度可扩展的数据分片解决方案。ShardingSphere 支持多种模式,包括 JDBC 模式、...

    应对sharding-jdbc结合mybatis实现分库分表功能 分表的联合查询采用将mysql的数据同步到elasticsearch进行筛选

    通过Sharding-JDBC和MyBatis实现数据库分片,结合Logstash将MySQL数据同步到Elasticsearch,解决了分库分表后的联合查询难题,同时利用Elasticsearch的高性能搜索能力,实现了高效的数据筛选。这样的设计思路在大...

    spring+mybatis+sharding-jdbc 1.3.1实现分库分表案例(可直接运行)

    在现代企业级应用中,随着数据量的增长,单表存储可能会遇到性能瓶颈,这时就需要引入分库分表策略来优化数据库架构。本案例基于Spring、MyBatis和Sharding-JDBC 1.3.1版本,提供了一个可以直接运行的分库分表实现,...

    分库分表_基于当当jdbc-sharding

    总结起来,基于当当jdbc-sharding的分库分表技术,通过配置文件(如`jdbc.properties`和`applicationContext.xml`)设定数据库连接和分片规则,利用`sql.txt`脚本处理数据操作,结合`config`和`algorithm`中的配置与...

    sharding-jdbc分库分表

    它作为JDBC的一个增强工具,可以在现有的Java应用中透明地添加分布式数据库处理能力,实现了数据的分库分表以及读写分离。 1. **分库分表原理**: 分库分表是解决大数据量下数据库性能瓶颈的有效手段。Sharding-...

    sharding-jdbc之——分库分表实例完整源码

    标题"sharding-jdbc之——分库分表实例完整源码"指出了本主题的核心,即`Sharding-JDBC`在实现数据库分库分表中的应用。Sharding-JDBC是阿里巴巴开源的轻量级Java框架,它可以在不修改现有数据库的情况下,对数据库...

    Sharding-JDBC使用案例-分库分表

    Sharding-JDBC是由阿里巴巴开源的轻量级Java框架,它定位为数据库中间件,提供了一种无需修改现有应用代码就能实现数据库分库分表的能力。Sharding-JDBC完全基于JDBC标准,可以理解为一个增强版的数据库驱动,它工作...

    springMvc Mybatis mysql 分库分表-shardingJdbc.zip

    ShardingJDBC的核心功能是分库分表,它通过规则配置,将一个大表拆分为多个小表,分散到不同的数据库中,从而提高查询和写入的效率。ShardingJDBC提供了透明化的数据访问层,使得应用无需感知分布式环境,像操作单个...

    SpringBoot(49) 整合sharding-jdbc实现自定义分库分表

    在本教程中,我们将深入探讨如何使用SpringBoot与Sharding-JDBC进行集成,以实现自定义的数据库分库分表策略。Sharding-JDBC是Apache软件基金会下的一个轻量级Java框架,它允许开发者在不改变原有业务代码和数据库...

    深度解析ShardingJDBC:Java开发者的分库分表利器.rar

    除了基本的分库分表功能,ShardingJDBC还提供了一套完整的数据库治理方案,包括数据源管理、连接池管理、监控与报警等,帮助开发者更好地管理和维护分布式数据库环境。 6. **使用场景**: ShardingJDBC适用于各种...

    mysql分库分表-mysql-sharding-jdbc.zip

    `mysql-sharding-jdbc` 是一个用于 MySQL 数据库分片的 Java 框架,它提供了 JDBC 驱动接口,使得开发者可以方便地在应用层进行分库分表操作。 一、MySQL 分库分表原理 1. 分库:将一个大型数据库拆分为多个小型...

    sharding-sphere读写分离分库分表.zip

    《基于Sharding-Sphere的数据库分库分表与读写分离技术详解》 在现代互联网应用中,随着数据量的快速增长,单个数据库往往难以承受高并发和大数据量的挑战,这时就需要采用分库分表和读写分离等技术来优化数据库...

    spring boot整合sharding jdbc5.2.0分库分表demo

    **Spring Boot 整合 ShardingSphere (Sharding JDBC) 5.2.0 分库分表实战** 在现代企业级应用开发中,随着业务量的增长,数据库的压力也随之增大,这时就需要进行数据库的分库分表操作来提升系统性能。Spring Boot ...

    sharding-sphere 分库分表 (springboot + mybat-sharding-sphere.zip

    标题"sharding-sphere 分库分表 (springboot + mybat-sharding-sphere.zip"表明这是一个关于使用Sharding-Sphere进行数据库分库分表的项目,结合了SpringBoot和MyBatis-Sharding-Sphere的实现。Sharding-Sphere是一...

    sharding-jdbc之——分库分表实例完整源码.zip

    "分库分表"是将一个大表的数据分散到多个数据库或表中,以实现水平扩展,提高系统的并发处理能力和数据读写性能。"实例完整源码"意味着这个压缩包包含了一个具体的实现案例,供学习和参考。 描述中提到的链接是一个...

Global site tag (gtag.js) - Google Analytics