分布式事务:本地事务与分布式事务

我们编写的扣减库存与保存订单是在两个服务中存在的。因为扣减库存后出现某些原因导致整一个下单流程出现错误,此刻会出现这样的状况:保存订单的本地事务(加了@Transactional注解)进行回滚,而扣减库存的事务(在其他微服务中)commit后无法回滚。这样就会造成数据不一致的情况,这其实就是我们所说的分布式事务的问题,接下来我们来学习分布式事务的解决方案。

1)事务

数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务拥有以下四个特性,习惯上被称为ACID特性:

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个操作在被数据库所执行一样。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操作将不可逆转。

2)本地事务

起初,事务仅限于对单一数据库资源的访问控制,架构服务化以后,事务的概念延伸到了服务中。倘若将一个单一的服务操作作为一个事务,那么整个服务操作只能涉及一个单一的数据库资源,这类基于单个服务单一数据库资源访问的事务,被称为本地事务(Local Transaction)。

在一个微服务里面所有业务方法操作的且是同一个数据库资源,这就是受到本地事务控制!

Spring的声明事务事务就是很好地本地事务解决方案! 加上 @Transactional注解

3)分布式事务

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

​ 最早的分布式事务应用架构很简单,不涉及服务间的访问调用,仅仅是服务内操作涉及到对多个数据库资源的访问。

当一个服务操作访问不同的数据库资源,又希望对它们的访问具有事务特性时,就需要采用分布式事务来协调所有的事务参与者。

​ 对于上面介绍的分布式事务应用架构,尽管一个服务操作会访问多个数据库资源,但是毕竟整个事务还是控制在单一服务的内部。如果一个服务操作需要调用另外一个服务,这时的事务就需要跨越多个服务了。在这种情况下,起始于某个服务的事务在调用另外一个服务的时候,需要以某种机制流转到另外一个服务,从而使被调用的服务访问的资源也自动加入到该事务当中来。下图反映了这样一个跨越多个服务的分布式事务:

如果将上面这两种场景(一个服务可以调用多个数据库资源,也可以调用其他服务)结合在一起,对此进行延伸,整个分布式事务的参与者将会组成如下图所示的树形拓扑结构。在一个跨服务的分布式事务中,事务的发起者和提交均系同一个,它可以是整个调用的客户端,也可以是客户端最先调用的那个服务。

较之基于单一数据库资源访问的本地事务,分布式事务的应用架构更为复杂。在不同的分布式应用架构下,实现一个分布式事务要考虑的问题并不完全一样,比如对多资源的协调、事务的跨服务传播等,实现机制也是复杂多变。

总结:
只要跨多个微服务,或者跨多个数据库,都属于分布式事务的场景!

分布式事务的方法不受到@Transactional注解的控制!

Memorial Day is 538 days
I miss you
xiaokeai

分布式事务:本地事务与分布式事务相关推荐

  1. 分布式事务(三)、柔性事务之 TCC、Saga、本地消息表、事务消息、最大努力通知

    目录 [前言] TCC Saga [通知型事务] 本地消息表 MQ事务消息 最大努力通知 总结 分布式事务: 分布式事务(一).CAP,BASE理论 分布式事务(二).刚性事务之 2PC.3PC [前 ...

  2. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  3. 我说分布式事务之消息最终一致性事务(二):RocketMQ的实现

    来源:https://0x9.me/A76YN 号外:最近整理了一下以前编写的一系列Spring Boot内容,整了个<Spring Boot基础教程>的PDF,关注我,回复:001,快来 ...

  4. 我说分布式事务之消息最终一致性事务(一):原理及实现

    来源:https://0x9.me/YgaUc 在之前的文章中,我们已经学习总结了分布式事务的两种解决方案. 我说分布式事务之TCC 我说分布式事务之最大努力通知型事务 本文我们将学习到另一种常见的柔 ...

  5. 事务回滚什么意思 try_分布式事务 TCC-Transaction 源码分析——事务恢复

    1. 概述 本文分享 TCC 恢复.主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover RecoverConfig,事务恢复配置接口 ...

  6. oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...

    分布式事务主要解决分布式一致性的问题.说到底就是数据的分布式操作导致仅依靠本地事务无法保证原的性.与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打包成一 ...

  7. 带你深入理解分布式事务,掌握后台分布式核心技术,PS:送5本!

    大家好,首先感谢大家对极客重生的长期支持.有了大家的认可和鼓励才有动力陆陆续续肝出了这么多文章.为了表示对大伙儿的感谢,今天我和冰河大佬要了5本纸质书,免费送出. 送书的规则是在评论区留言,截止到今天 ...

  8. spring分布式事务示例_Spring声明式事务示例

    spring分布式事务示例 事务是具有ACID (原子,一致,隔离和持久)属性的工作单元. 原子意味着所有更改都发生或什么都没有发生. 如果从一个帐户借钱并记入另一个帐户,则交易将确保借记和贷项均已完 ...

  9. 分布式事务最终一致性mysql_分布式事务最终一致性方案案例

    前言: 以下以网上课程购买流程举一个例子: 如何实现两个分布式服务(订单服务.学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求, 这里的关键是如何保证两个分布式服务的事务的一致性. 订单支 ...

  10. rocketmq整合mysql事务_分布式事务(4)---RocketMQ实现分布式事务项目

    摘要: ,但是returnLocalTransactionState.COMMIT_MESSAG的时候*服务挂了,那么最终Brock还未收到消息的二次确定,还是个半消息,所以当重新启动的时候还是回调这 ...

最新文章

  1. 升级到12c云数据库的最佳实践
  2. 【Matlab】访问提取时序数据
  3. Ngrok: 使用 Ngrok 实现内网穿透
  4. angular 应为声明或语句_“允许”员工自愿降薪后,多益网络再发声:声明降薪非自愿者奖 3 万...
  5. C#操作word文档(二)
  6. 深入理解asp.net中的 __doPostBack函数
  7. openshift4离线部署_OpenShift 4.2 离线安装补充记录
  8. 坚实原则:Liskov替代原则
  9. zabbix监控操纵系统日志
  10. 用 Javascript 验证表单(form)中多选框(checkbox)值
  11. c语言的加法和平均值程序,编写求一组整数的和与平均值的程序
  12. [转] MongoDB shell 操作 (查询)
  13. [转载]Linux shell中的竖线(|)——管道符号
  14. 测试人员该学习哪些Linux知识
  15. Visio Professional详细教程(二)
  16. java微信支付通知接口_java实现微信支付结果通知
  17. XAMPP下的Tomcat 7运行出现“1% 不是有效的 Win32 应用程序。”
  18. From表单邮箱后缀提示
  19. 强哥说Java--Java接口,java高级软件工程师试卷
  20. 计算机滴答滴的教学,滴答滴教案

热门文章

  1. format格式化相关知识
  2. nginx配置反向代理浏览器输入地址后点击登陆URL发生变化的处理
  3. 地层矿工地质导向软件简介
  4. “空姐网”网站策划案
  5. BERT-of-Theseus
  6. 学籍管理系统软件需求分析
  7. php0034 rankl,SEKH-0001-Human IL-1 alpha ELISA试剂盒
  8. php接受本地图片上传,用php把本地要上传的图片经过剪切,存入数据库
  9. linux find查找重复文件
  10. Java泛型与Kotlin泛型