分布式事务产生的背景
在微服务环境下,因为会根据不同的业务会拆分成不同的服务,比如会员服务、订单服务、商品服务等,让专业的人做专业的事情,每个服务都有自己独立的数据库,并且是独立运行,互不影响。
服务与服务之间通讯采用RPC远程调用技术,但是每个服务中都有自己独立的数据源,即自己独立的本地事务。两个服务相互通讯的时候,两个本地事务互不影响,从而出现分布式事务产生的原因。
传统项目中:多数据源就是在一个项目中,有两个jdbc连接
环境搭建: 分包或者注解方式
案例:
在电商系统中,下单和扣库存如何保持一致?
比如:用户先下单后,扣库存失败,那么将会导致超卖;如果下单不成功,扣库存成功,那么会导致少卖。这两种情况都会导致运营成本增加,在严重情况下需要赔付。
订单服务和库存服务
下单失败了 但是库存成功了 怎么个回滚法
同理 下单成功 库存失败了呢!这个不属于分布式事务! 拿到错误的返回结果 进行处理就ok啦
我在调用接口时候 掉完了 然后我错了
因为订单服务和库存服务不在同一个jvm中,数据库都是独立的。每个独立的数据库源都有自己独立事务,该事务成为本地事务。
本地数据源有效范围 : 同一个jdbc连接
而多数据源 不同的 多个jdbc连接
每个独立的事务,核心思想 全局事务 一个协调者
项目中 两个不同的jdbc,连接相同的数据库。 两个jdbc事务不能相互关联!
在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词
比如:CAP与Base理论、柔性事务与刚性事务、理解最终一致性思想,JTA+XA、两阶段与三阶段提交等。
如何保证强一致性呢?计算机专业的童鞋在学习关系型数据库的时候都学习了ACID原理,这里对ACID做个简单的介绍。如果想全面的学习ACID原理,请参考ACID
关系型数据库天生就是解决具有复杂事务场景的问题,关系型数据库完全满足ACID的特性。
数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):
原子性(Atomicity) 原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
一致性(Consistency)一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
隔离性(Isolation)多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
持久性(Durability)这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)