分布式事务(代码片段)

chinano1 chinano1     2023-01-24     722

关键词:

事务介绍(引用百度百科):

  数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性

传统单机事务:

技术分享图片

示例业务逻辑步骤:创建订单请求到达,订单系统需要执行1.生成订单,2.锁定优惠券,3.锁定贷款券

代码模型:

 1 public Result createOrder()
 2     ...
 3     saveOrder();
 4     ...
 5 
 6 
 7 @Transaction
 8 private void saveOrder()
 9     1.生成订单
10     Order orde = saveOrder();
11     2.优惠券
12     lockCouponNumber();
13     3.贷款券
14     lockLoanNumber();
15 

由于1、2、3都在本地事内,所以一旦任何一步操作出现异常,都会回滚,满足acid

soa化之后:

随着公司体量发展,订单系统日益庞大,造成维护、测试不便,所以要进行拆分,拆分后架构如下:

技术分享图片

代码如下:

1 @Transaction
2 public void saveOrder()
3     1.生成订单
4     Order orde = saveOrder();
5     2.锁定优惠券
6     invokeLockCouponNumber();
7     3.锁定贷款券
8     invokeLockLoanNumber();
9 

问题:

在分布式系统中,每一个机器节点虽然都能明确的知道自己执行的事务是成功还是失败,但是却无法知道其他分布式节点的事务执行情况。比如:假设1和2执行成功,3失败,就导致最终状态不一致

分布式事务解决方案:

eBay在2008年公布了一个关于BASE准则提到一个分布式事务解决方案。eBay的方案其实是一个最终一致性方案,它主要采用消息队列来辅助实现事务控制流程

示例:

 1 createOrder()
 2     try
 3         ...
 4         saveOrder();
 5         ...
 6     catch(Exception e)
 7         //发送rmq消息、优惠券、贷款券系统收到消息后,解绑
 8         sendCreateFailMsg();
 9     
10 
11 
12 @Transaction
13 private void saveOrder()
14     1.生成订单
15     Order orde = saveOrder();
16     2.锁定优惠券
17     invokeLockCouponNumber();
18     3.锁定贷款券
19     invokeLockLoanNumber();
20 

捕获到saveOrder异常后,发送创建订单失败的消,优惠券、贷款券系统订阅此消息,收到消息后做解绑操作。

需要解决的问题:

1,创建订单失败的消息发送失败 2,消息丢失 3,重复消费

对于1,有同学可能会想到事务消息,但在此业务场景并不适用,我的一个方案:将消息体等信息存放在数据库中,由定时器执行

对于2,现在用的比较普遍的MQ都具有持久化消息的功能,如果消费者宕机或者消费失败,都可以执行重试机制

对于3,方案一:保证幂等性,例记录执行后将rocketmq的messageId,kafka的话,将消费组名+parttition+offet组成唯一的key记录在数据库中

保证最终一致性的模式

1.    查询模式

任何一个服务操作都提供一个查询接口,用来向外部输出操作执行的状态。服务操作的使用方可以通过接口得知服务操作执行的状态,然后根据不同状态做不同的处理操作 为了能够实现查询,每个服务操作都需要有唯一的流水号

2.    补偿模式

有了查询模式,我们就能够得知操作所处的具体状态,如果整个操作处于不正常状态,我们需要修正操作中的出现问题的子操作。也许是要重新执行,或者取消已完成的操作。通过修复使得整个分布式系统达到最终一致。这个过程就是补偿模式

根据发起形式又分为

自动恢复:通过对发生失败操作的接口自动重试或者回滚已经完成的操作

通知运营:如果程序无法自动完成恢复,则通过运营人员手动进行补偿

通知技术:通过监控或者告警通知到技术人员,通过技术手段进行修复

CAP原则(CAP定理)、BASE理论

CAP原则  

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得   。

BASE

BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

分布式事务详解(代码片段)

最近面临面试,抽空了解了下分布式事务,这篇主要介绍一下分布式事务相关的知识点以及现目前最流行的分布式事务解决工具seata。OK,进入正题目录1.本地事务1.1 什么是本地事务1.2 本地事务如何保证ACID1.2.1 undo... 查看详情

seata:分布式事务(代码片段)

SpringCloudAlibabaSeata:分布式事务一、Seata简介1.Seata的由来​随着互联网项目的发展,分布式架构的项目显示出了独特的独特的魅力。但是分布式事务问题在分布式架构项目中越显重要。​2019年1月阿里巴巴团队发起了开源项目Fesca... 查看详情

mysql的分布式事务(代码片段)

...存储引擎提供了对XA事务的支持,并通过XA事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactionalresources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以... 查看详情

分布式事务(代码片段)

事务介绍(引用百度百科):  数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更... 查看详情

分布式事务处理方案,微服事务处理方案(代码片段)

微服事务处理方案(分布式事务处理方案)1.什么是事务由一组操作构成的可靠、独立的工作单元。事务具有以下特点:?Atomicity(原子性)?Consistency(一致性)?Isolation(隔离性)?Durability(持久性)2.事务的一致性单体应用可以在数据库的... 查看详情

springcloud(12)—分布式事务(seata)(代码片段)

SpringCloud(12)—分布式事务(Seata)一事务基础1.事务的ACID原则2.分布式事务问题在分布式系统下,一个业务跨越多个服务或数据源,每一个服务都是一个事务。要保证所有分支事务的最终状态一致,... 查看详情

什么是分布式事务capbase理论?(代码片段)

什么是分布式事务、CAP、BASE理论?什么是分布式事务?介绍这个之前,先来了解一下这几个问题什么是事务?什么是本地事务?什么是分布式?什么是分布式事务?什么是事务?完成某件事情,可能有多个参与者需要执行多个... 查看详情

微服务分布式事务介绍(代码片段)

文章目录1.事务简介2.本地事务3.分布式事务典型场景3.1)跨库事务3.2)分库分表3.3)服务化4.X/OpenDTP模型与XA规范4.1DTP模型4.2XA规范5.两阶段提交协议(2PC)6.三阶段提交协议(Three-phasecommit)CanCommit阶段PreCommit阶段doCommit阶段2PC与3PC的区别1.... 查看详情

设计----分布式事务分布式事务和解决方案(代码片段)

一、前言分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简单聊一下。二、数据库事务在说分布式事务之前... 查看详情

分布式事务专题-基本概念(代码片段)

...目录前言一、什么是事务二、什么是本地事务三、什么是分布式事务四、分布式事务产生的场景结尾前言事务想必大家并不陌生,至于什么是ACID,也是老生常谈了。不过小编为了保证文章的完整性确保所有人都听得懂... 查看详情

分布式事务专题-基本概念(代码片段)

...目录前言一、什么是事务二、什么是本地事务三、什么是分布式事务四、分布式事务产生的场景结尾前言事务想必大家并不陌生,至于什么是ACID,也是老生常谈了。不过小编为了保证文章的完整性确保所有人都听得懂... 查看详情

分布事务和分布式锁(代码片段)

分布式事务1两阶段提交二阶段提交协议(Two-phaseCommit,即2PC)是常用的分布式事务解决方案,即将事务的提交过程分为两个阶段来进行处理:准备阶段和提交阶段阶段1:准备阶段协调者向所有参与者发送... 查看详情

分布式事务面试八股文(2022最新整理)(代码片段)

分布式事务面试八股文(2022最新整​目录事务分布式事务强一致性、弱一致性、最终一致性分布式事务的基础CAP理论BASE理论分布式事务解决方案2PC方案TCC本地消息表MQ事务Saga事务最大努力通知方案参考文章事务事务是应用... 查看详情

分布式事务面试八股文(2022最新整理)(代码片段)

分布式事务面试八股文(2022最新整​目录事务分布式事务强一致性、弱一致性、最终一致性分布式事务的基础CAP理论BASE理论分布式事务解决方案2PC方案TCC本地消息表MQ事务Saga事务最大努力通知方案参考文章事务事务是应用... 查看详情

分布式事务使用atomikos+jta解决分布式事务问题(代码片段)

一、前言分布式事务,这个问题困惑了小编很久,在3个月之前,就间断性的研究分布式事务。从MQ方面,数据库事务方面,jta方面。近期终于成功了,使用JTA解决了分布式事务问题。先写一下心得,后面的二级提交也会在研究。... 查看详情

分布式事务篇——第一章:分布式事务前言(代码片段)

...  做开发的同学,在一般的互联网公司会很少接触到分布式,甚至本地事务都不一定经常用,全是靠DB来做支持,或者通过Mybatis,一旦接触到分布式,就一定离不开核心点——分布式事务,本章就来唠... 查看详情

别再说你不知道分布式事务了(代码片段)

简介我们都知道Seata是一个分布式事务的解决方案,今天我们就来带大家了解一下什么是分布式事务,首先我们先来了解一下基础的知识——事务,我们先来了解一下事务的概念是什么。基本概念事务四部分构成——ACIDA(Atomic):... 查看详情

分布式事务解决方案之alibabaseata(代码片段)

关于事务的几点常识本地事务该类事务需要满足四大特性:ACID(原子性、一致性、隔离性、持久性),仅限于对单一数据库资源的访问控制。原子性(Atomicity):指事务作为整体来执行,要么全部执行,要么全部不执行。一致... 查看详情