博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈分布式事务原理及其应用场景
阅读量:5377 次
发布时间:2019-06-15

本文共 1730 字,大约阅读时间需要 5 分钟。

概念:

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说, 就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。 本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

分布式事务的应用场景:

事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性。但是分布式事务处理过程中,

1. 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多个数据库。这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。

2. 所谓的SOA化,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心。对于订单中心,有 专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那 么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。

另外还比如:

某些场地比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证?

在搜索广告系统中,当用户点击某广告后,除了在点击事件表中增加一条记录外

事务的ACID特性

事务必须满足传统事务的特性,即原子性,一致性,分离性和持久性。

1. 所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。

2. 事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元。

3. 所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。

4. 所谓的持久性,就是说一单事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。

常见解决方案:

1. 基于XA协议的两阶段提交

分布式事务通常采用2PC协议,全称Two Phase Commitment Protocol。该协议主要为了解决在分布式数据库场景下,所有节点间数据一致性的问题。分布式事务通过2PC协议将提交分成两个阶段:

1. prepare

2. commit/rollback

阶段一为准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。 

阶段二为提交阶段(commit)。当transaction manager确认所有参与者都ready后,向所有参与者发送commit命令。

 2. 消息事务+最终一致性

所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败

总结:

分布式事务,本质上是对多个数据库的事务进行统一控制,按照控制力度可以分为:不控制、部分控制和完全控制。不控制就是不引入分布式事务,部分控制就是各 种变种的两阶段提交,包括上面提到的消息事务+最终一致性、TCC模式,而完全控制就是完全实现两阶段提交。部分控制的好处是并发量和性能很好,缺点是数 据一致性减弱了,完全控制则是牺牲了性能,保障了一致性,具体用哪种方式,最终还是取决于业务场景。作为技术人员,一定不能忘了技术是为业务服务的,不要 为了技术而技术,针对不同业务进行技术选型也是一种很重要的能力!

转载于:https://www.cnblogs.com/clarke157/p/8111685.html

你可能感兴趣的文章
UglifyJS压缩JS
查看>>
PHP array_diff_uassoc
查看>>
Word添加论文引用标注
查看>>
根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米...
查看>>
【总结】线段树
查看>>
前端必备 CSS Sprites雪碧图生成工具
查看>>
面试题51:数组中重复的数字
查看>>
java多线程整理
查看>>
api中locale或language字段,传送客户端地域信息,一般为下划线
查看>>
spark1.3.1安装和集群的搭建
查看>>
linux useradd 的一个用法
查看>>
MySQL开启远程连接的方法
查看>>
Spring学习笔记之五----Spring MVC
查看>>
ionic v1.1.0 select 安卓不工作
查看>>
智能的API、云服务和SOA测试解决方案——Parasoft SOAtest
查看>>
前端之html的常用标签2和css基本使用
查看>>
去掉 map area 在IE里点击时出现的框
查看>>
[HDU 3652] B-number
查看>>
详解主席树(可持久化线段树)
查看>>
php 根据给定的年份和月份获取该年份该月份的起始和结束时间
查看>>