首页 > 其他分享 >分布式事务

分布式事务

时间:2023-09-27 14:34:35浏览次数:45  
标签:事务 隔离 回滚 提交 一致性 数据 分布式

分布式事务

传统数据库事务

一,什么是事务

事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元

二、为什么需要事务?

事务包含了一组操作,这些操作可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,这些操作都不会执行,前面执行的操作也会回滚原状态,用来保证数据的一致性和完整性。例如,就像银行转账,张三给李四转账,只有当张三的钱转走了,并且李四账户的钱收到了之后才会事务提交,否则事务会回滚到转账前的状态,保证数据的一致性,保证数据不会出错。

事务的四大特性

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

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

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

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

在实际应用中,数据库中的数据是要被多个用户共同访问的,在多个用户同时操作相同的数据时,可能就会出现一些事务的并发问题

1)脏读

指一个事务读取到另一个事务未提交的数据。

2)不可重复读

指一个事务对同一行数据重复读取两次,但得到的结果不同。

3)虚读/幻读

指一个事务执行两次查询,但第二次查询的结果包含了第一次查询中未出现的数据。

4)丢失更新

指两个事务同时更新一行数据,后提交(或撤销)的事务将之前事务提交的数据覆盖了。

丢失更新可分为两类,分别是第一类丢失更新和第二类丢失更新。

  • 第一类丢失更新是指两个事务同时操作同一个数据时,当第一个事务撤销时,把已经提交的第二个事务的更新数据覆盖了,第二个事务就造成了数据丢失。

  • 第二类丢失更新是指当两个事务同时操作同一个数据时,第一个事务将修改结果成功提交后,对第二个事务已经提交的修改结果进行了覆盖,对第二个事务造成了数据丢失。

为了避免上述事务并发问题的出现,在标准的 SQL 规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。这四种事务的隔离级别如下。

隔离性四种隔离级别

1)Read Uncommitted(读未提交)

一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。会产生脏读、幻读、不可重复读的问题

2)Read Committed(读已提交)

一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。会产生幻读、不可重复读的问题

3)Repeatable Read(可重复读取)

一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。会产生幻读的问题

4)Serializable(可串行化)

提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。

一般来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,通常将数据库的隔离级别设置为 Read Committed,即读已提交数据,它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁和乐观锁加以控制。

控制事物

1.使用JDBC事务:通过使用JDBC的Connection对象的setAutoCommit()方法来控制事务的提交和回滚。

2.使用spring事务:Spring框架提供了事务管理器(例如DataSourceTransactionManager)和@Transactional注解来控制事务

3.MybatisSqlSession的手动提交,如果在执行sql的语句中进行trycatch,成功执行commit()方法提交,失败在catch中执行rallback方法进行回滚。

分布式事务

就是在分布式环境下,出现的事务问题,对比传统事务来说,分布式事务又分为,刚性事务,和柔性事务,刚性事务需要保证数据的强一致性,柔性事务呢需要保证数据的最终一致性。

分布式事务理论

CAP定理

分布式系统下的三个指标

1.一致性(Consistency):指的是强一致性即用户访问分布式系统中的任意节点,得到的数据必须一致。

2.可用性(Availability):用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝。

3.分区容错性:分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务

在分布式环境下,这三个指标不可能同时做到,且P是一定要保证的

因为网络是不可靠的。客户因素,没办法避免

CP:在一定时间内,等待集群节点进行数据同步后,对外提供访问

AP:在任何时间内,都对外访问,但是得到的数据可能不一样

base理论

对CAP的一种补充放弃强一致性,追求最终一致性

三个思想

基本可用(Basically Available):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。

软状态(Soft State):在一定时间内,允许出现中间状态,比如临时的不一致状态。比如订单状态:待付款、已付款待发货、已发货、已签收、已结束

最终一致性(Eventually Consistent):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

AP保证最综一致性

CP保证强一致性

seata解决分布式事务

seata的三个架构

TC(Transaction Coordinator)事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。监控和通知各个事务,包括分支事务和全局事务

TM (Transaction Manager) :事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。用来执行事务

RM (Resource Manager):资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

XA:强一致性,基于数据库隔离,无代码侵入,在一阶段不提交事务

AT:默认模式,基于全局锁隔离,无代码侵入,一阶段提交事务,在提交事务前,会记录undolog日志,性能比XA模式好,二阶段TC通知回滚,则根据undolog回滚,通知提交,则删除undolog日志。

TCC:性能最好,不需要依赖关系型数据库,但代码入侵读高。Try:冻结可用数据,Confirm:确认提交数据,删除冻结数据 Canel:恢复数据,将冻结数据恢复

Seaga: 用于长事务,例如A项目调另外一个公司的项目接口。

XA模式工作原理图

 

 AT模式工作图

 

标签:事务,隔离,回滚,提交,一致性,数据,分布式
From: https://www.cnblogs.com/zgd1/p/17732657.html

相关文章

  • 科技云报道:分布式存储红海中,看天翼云HBlock如何突围?
    过去十年,随着技术的颠覆性创新和新应用场景的大量涌现,企业IT架构出现了稳态和敏态的混合化趋势。在持续产生海量数据的同时,这些新应用、新场景在基础设施层也普遍基于敏态的分布式架构构建,从而对存储技术提出了新的要求。正因如此,分布式存储凭借高安全性、可靠性、可用性、易于扩展......
  • 分布式事务
    分布式事务  事务在逻辑上是的一组操作,要么都执行,要么都不执行,事务有四个特点也就是常说的ACID,A代表原子性,是最小事务的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;C代表一致性,执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的,I代表隔......
  • 传统事务,分布式事务分析
    这里先抛出一个问题:什么是事务?什么是分布式事务?由于隔离机制做的不恰当,在并发事务操作中我们经常会遇见的三个问题(1)脏读(DirtyRead):脏读是指一个事务在读取了另一个事务未提交的数据时发生的情况。假设事务A更新一个数据,但是还没有提交,事务B读取了这个未提交的数据,然后事务A回滚......
  • 详解分布式系统核心概念——CAP、CP和AP
    最近研究Sykwalking,当调研oap如何进行集群部署时发现:skywalkingoap之间本身不能搭建集群,需要一个集群管理器来组建集群,它支持nacos、zookeeper、Kubernetes、Consul、Etcd五种集群管理器。我重点比较了nacos和zookeeper,发现二者最大的区别是Zookeeper采用了CP架构,nacos既支持CP......
  • 分布式事务
      分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如呢跨数据源的分布式事务,还有跨服务的分布式事务,而分布式事务中又有很多个本地事务,在每个本地事务中药保证ACID的原则,而分布式事务呢我们就可以把所有的事务看作是一个业务,也就是全局事务,要保证全局事务的原......
  • SpringBoot | Redis序列化与分布式锁
    欢迎参观我的博客,一个Vue与SpringBoot结合的产物:https://poetize.cn博客:https://gitee.com/littledokey/poetize-vue2.git聊天室:https://gitee.com/littledokey/poetize-im-vue3.git后端:https://gitee.com/littledokey/poetize.git七牛云登录/注册地址(文件服务器,CDN):https:/......
  • 如何设计实现一个好用的分布式监控体系?
    dg-publish:truetitle:可观测性:如何设计实现一个好用的分布式监控体系?createTime:2023-09-2523:35tags:-kafka可观测性:如何设计实现一个好用的分布式监控体系?怎样实现好用的指标和日志模块,以便我们快速定位业务问题出在哪里指标需要关注哪几个维度?从技术上看,指标......
  • 如何实现简单的分布式链路功能?
    为什么需要链路跟踪为什么需要链路跟踪?微服务环境下,服务之间相互调用,可能存在A->B->C->D->C这种复杂的服务交互,那么需要一种方法可以将一次请求链路完整记录下来,否则排查问题不好下手、请求日志也无法完整串起来。如何实现链路跟踪假设我们从用户请求接口开始,每次请求需要有......
  • Spring事务的传播机制
     https://www.bilibili.com/video/BV1hu411N7gA/?p=6&spm_id_from=pageDriver&vd_source=0d7b1712ce42c1a2fa54bb4e1d601d78......
  • Hadoop是什么? Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并
    Hadoop是什么?Hadoop是一个由Apache开发的开源分布式计算框架,它能够处理大规模数据并行处理任务,支持大规模数据存储和处理。Hadoop的核心组件包括分布式文件系统HDFS和分布式计算框架MapReduce,它们使得Hadoop可以在廉价的硬件上并行地处理大量数据。Hadoop还包括很多相关的项目和子......