当前位置: 首页 > news >正文

数据库分库分表(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模式,性能与事务可靠性的平衡,支持系统水平伸缩,大多数情况下是最合适的选择;事务补偿机制,只能适用于对事务性要求不高,允许数据“最终一致”即可的系统,牺牲实时一致性,获得最大的性能回报。

转:http://blog.csdn.net/bluishglc/article/details/7793172

相关文章:

  • NSTimer+倒计时功能实现
  • 轮播1-animate-匀速
  • PhantomJS 安装
  • 翻转式用户登录注册界面设计
  • Web应用防护系统OpenWAF开源CC防护模块
  • python运算符优先级
  • 设计模式C++实现——模板方法模式
  • 第四(装饰器、迭代器、生成器)
  • windows下实现快捷键截图小工具
  • 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)
  • Oracle使用row_number()函数查询时增加序号列
  • 【Java基础】序列化与反序列化深入分析
  • Elasticsearch前沿:ES 5.x改进详解与ES6展望
  • 一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!
  • node-glob通配符
  • Android优雅地处理按钮重复点击
  • C# 免费离线人脸识别 2.0 Demo
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JAVA 学习IO流
  • Java教程_软件开发基础
  • JS变量作用域
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python爬虫--- 1.3 BS4库的解析器
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Vue2.0 实现互斥
  • vue自定义指令实现v-tap插件
  • 复杂数据处理
  • 简单数学运算程序(不定期更新)
  • 面试总结JavaScript篇
  • 前端路由实现-history
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 实习面试笔记
  • 跳前端坑前,先看看这个!!
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​MySQL主从复制一致性检测
  • (10)ATF MMU转换表
  • (20050108)又读《平凡的世界》
  • (独孤九剑)--文件系统
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (论文阅读11/100)Fast R-CNN
  • (十)c52学习之旅-定时器实验
  • (转)h264中avc和flv数据的解析
  • .axf 转化 .bin文件 的方法
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core 版本不支持的问题
  • .NET企业级应用架构设计系列之结尾篇
  • @RequestParam详解
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [100天算法】-实现 strStr()(day 52)
  • [Angular] 笔记 6:ngStyle
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息