开发者学堂课程【(知识精讲+项目实战)第五阶段:分布式事务理论】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/687/detail/11922
分布式事务理论
内容介绍
一、事务的定义
二、事务的分类
一、事务的定义
1、定义
事务指的就是一个大的操作单元,在这个操作单元中会有很多小型的
操作。事务保证的就是在同一个操作单元中的所有小型操作要保持着
一致的行为。这些小型操作要么全部都成功,要么所有的操作都被撤
销。简单来讲,事务就是提供了一种“要么什么都不做,要么做全套”
的机制。
2、举例说明
对此举出一个生活中的例子。在超市购物时经常出现一句话为“一手
交钱,一手交货”。
在这样的场景中就可以把购物当作一个操作单元,而“交钱”和“交
货”就可以作为操作单元中的两个小型操作。这两个小型操作一定是
要保持一致行为的。也就是要么“顾客付款给商家,商家将货交给顾
客”,要么“顾客未付款给商家,商家未将货交给顾客”。“顾客付款
而商家未交货”这种行为是不可能出现的。这就是事务的一个基础解
释。
二、事务的分类
事务基本上可以分为两大类。第一个为本地事务,第二个为分布式事
务。
1、本地事务
首先来了解一下本地式事务。本地事务可以认为是数据库提供的事务
机制。一旦谈到数据库的事务机制就必须了解数据库事务机制中所提
到的四个基本特性。这四个特性总结起来可以称作 ACID。
四大特性:
(1)A:原子性(Atomicity):一个事务(transaction)中的所有操作,
要么全部完成,要么全部不完成,不能再次被拆分。
(2)C:一致性(Consistency),在一个事务执行之前和执行完毕之后数
据库都必须处于一致性状态。比如转账这一行为,从A账户向B账
户转账10元。假设原始状态两个账户均是100元,转账之前两个账
户合计为200元,转账之后A账户扣除10元变成90元,B账户增
加10元变成110元,两个账户的合计仍为200元,一定不会出现“A
账户扣除10元,从而变为90元;B账户却未增加10元,仍是100
元。两个账户的合计为190元。”数据库的一致性被破坏了,事务就
出现问题了。
(3)I:隔离性(Lsolation),在并发环境中,当多个不同的事务同时
操作相同的数据时,事务之间是互不影响的。如果产生了影响,那么
这个事务也是存在问题的。
(4)D:持久性(Durability),指的是只要事务成功结束,它对数据库
所做的更新就必须持久化的保存下来。这就是本地事务也可以是数据
库事务的四个特性。
数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个
不可分割的执行单元中,该执行单元中的所有操作要么都成功,要么
都失败。也就是当这一个操作单元中的所有操作全部执行成功就全部
提交到数据库中。只要其中任一操作执行失败,都将导致整个事务中
所有操作的回滚。这就是数据库实现事务的一个基本原理。
2、分布式事务
(1)二者的联系与区别
把分布式事务和本地事务进行对比,好像是有一些联系,都是和业务
相关。同时又有一些区别,一个为本地,一个为分布式。
(2)分布式事务的定义
分布式事务指事务的参与者,支持事务的服务器,资源服务器以及事
务管理器分别位于不同的分布式系统的不同节点之上。
简单的说,就是在分布式事务中,一次大的操作由不同的小操作组成,
这些小的操作分布在不同的服务器上,且属于不同的应用。分布式事
务需要保证在不同服务器上的这些小操作要么全部成功,要么全部失
败。这样就把本地事务和分布式事务基本上进行了对比。
本质上来讲,分布式事务就是为了保证不同数据库的数据一致性。比
如方才转账的例子都是在一个数据库上,A账户和B账户之间的转
账均是在一个数据库上。对此就可以利用数据库的 ACID 特性进行控
制,从而保证事务性。
但是现在A账户和B账户位于不同的数据库上,这样就无法利用数
据库的特性来保证事务的一致性了。假如A账户减少10元并成功提
交,B账户增加10元却失败,这已经不是同一个数据库了,利用数
据库本身的回滚机制已经无法回滚了。这就是分布式事务所遇到的一
些问题。
(3)分布式事务的场景
①单体系统访问多个数据库,一个服务需要调用多个数据库实例完成
数据的增删改操作。
如果有下单的任务,就会在订单数据库增加一份订单,在库存数据库
修改某一个商品的库存,这样的话订单数据库和库存数据库就是在一
个事务中同时成功同时失败的。但是现在订单和库存位于不同的数据
库上了,就无法保证二者同时成功了。
②多个微服务访问同一个数据库,多个服务需要调用一个数据库实例
完成数据的增删改操作。
订单和库存位于一个数据库中。下订单是在订单微服务中操作的,捡
库存是在库存微服务中进行的。下订单成功之后就需要远程调用一个
微服务,订单和库存现在位于不同的微服务上,如果要使订单和库存
处同一个事务的包含之中,这也是不可能的。这个时候就产生了分布
式事务这样的问题。
③多个微服务访问多个数据库,多个服务需要调用一个数据库实例完
成数据的增删改操作。
这个就是把上面的两种情况进行融合。订单微服务访问订单数据库,
库存微服务访问库存数据库。中间则是一个调用关系。这种情况肯定
还是存在分布式事务问题的。这就是分布式事务经常存在的一些场
景。