首页 > 其他分享 >传统事务,分布式事务分析

传统事务,分布式事务分析

时间:2023-09-27 11:13:50浏览次数:35  
标签:事务 读取 幻读 隔离 提交 数据 传统 分布式

这里先抛出一个问题:什么是事务?什么是分布式事务?

由于隔离机制做的不恰当,在并发事务操作中我们经常会遇见的三个问题
(1)脏读(Dirty Read):脏读是指一个事务在读取了另一个事务未提交的数据时发生的情况。假设事务A更新一个数据,但是还没有提交,事务B读取了这个未提交的数据,然后事务A回滚了或者修改了这个数据,这时事务B读取到的数据实际上是不正确的,也就是脏数据。脏读可能导致数据的不一致性。

(2)幻读(Phantom Read):幻读是指一个事务在读取了另一个事务已提交的数据后,再次读取同一个范围的数据时,发现有新的数据出现,就好像发生了幻觉一样。例如,事务A查询某个范围的数据,事务B在事务A完成后插入了一条符合该范围的数据,然后事务A再次查询同一个范围的数据,发现多了一条数据。这个现象称为幻读。幻读可能导致查询结果的不一致性。

(3)不可重复读(Non-repeatable Read):不可重复读是指一个事务在读取了某个数据后,另一个事务对该数据进行了修改或删除操作,导致第一个事务再次读取该数据时,获取到了不同的结果。例如,事务A读取某个数据,事务B修改了该数据并提交,事务A再次读取同一个数据时,发现数据的值不一样了。这种现象称为不可重复读。不可重复读可能导致读取操作的不一致性。
*需要注意的是,脏读、幻读和不可重复读,解决这些问题一般需要采取如下措施:
    锁机制:如使用悲观锁或乐观锁来保证数据的一致性和完整性。
    事务隔离级别:通过设置合适的事务隔离级别来避免脏读、幻读和不可重复读问题。
    业务设计:在数据的读写操作中,根据实际业务需求进行合理的设计,避免并发操作导致的问题。

带着问题分析事务。。。。
传统数据库事务
一、事务的特性:

Atomicity 原子性:事务的所有操作要末全部成功,要末全部失败。
Consistency一致性:要保证事务开启时到事务结束后数据状态一致。
Isolation隔离性:要保证多个事务之间操作相互之间不影响,互相隔离。 比如说这边转账和你支付不互相影响。
Durability持久性:事务一旦提交,则是永久的保存到磁盘,不可逆

二、事务的隔离级别

(1)读未提交:再一个事务执行写操作的时候,另一个事务进来执行读操作,读取了第一个事务写未提交的东西,导致你读到了没有修改完成的数据,如果第一个事务提交的事务提交的时候回滚了,造成你读的数据可能根本不存在。产生脏读,幻读,不可重复读的问题。

(2)读已提交:再一个事务进行写操作的时候,而无法看到未提交的数据或在查询执行期间其它事务提交的数据,会产生幻读、不可重复读的问题,oracle默认的隔离级别就是。

(3)可重复读:在可重复读级别下,事务可以多次读取同一行数据,并且在事务执行期间,其他事务无法修改这些数据。这意味着,(在可重复读的时间里面无视你修改)如果一个事务在读取某行数据后,另一个事务修改了该行数据,第一个事务再次读取该行数据时,仍然会得到原来的值,而不是修改后的值。可能会产生幻读问题他也可能因为你插入数据,我再读同一行的时候发现不一样,另起一行展示这个数据。mysql默认的隔离级别是可重复读

(4)串行化:没有任何问题,但是相当于锁表,效率极低。所以这种方案不用

在程序中事务执行隔离级别是默认的,如果你用的是MySql那就是可重复读隔离级别,当然我们是可以设置的在我们的程序也可以设置事务特性,就是根据Transactional里面的isolation方法,设置几大隔离级别。

 我当前在程序中执行的就是对事务的默认隔离级别设置成了读已提交。

传统事务在不同应用上的事务控制,
JDBC:Connection  创建不同的连接
Mybatis:SqlSession    配置数据库的链接文件,读取配置文件形成一个输入流,获取连接的sqlSession对象。

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    //静态代码块
    static {
        try {
            //加载配置文件,得到数据流
            InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
//SqlSessionFactoryBuilder:这是MyBatis提供的建造者模式的构建器类,用于构建SqlSessionFactory对象
//build(resourceAsStream):这是SqlSessionFactoryBuilder类的build方法,用于从指定的输入流(resourceAsStream)中构建SqlSessionFactory对象。
resourceAsStream:这是一个输入流,通常用于读取MyBatis配置文件,其中包含关于数据库连接信息、映射文件位置等配置。
    
    
    //用构建的SqlSessionFactory对象,使用openSession方法创建一个SqlSession对象,可以通过该实例进行数据库操作。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
    //提交事务 和 释放资源
    public static void close(SqlSession sqlSession){
        if(sqlSession !=null){
            sqlSession.commit();
            sqlSession.close();
        }
    }
}

Spring:基于运行时异常的声明式事务

分布式事务

概念:在分布式环境中,出现的事务问题。

分布式就是一个项目分成多个模块,每个模块都是一个独立的服务都有自己的数据库,
但是在一个项目中难免造成服务调服务,再通过其他服务调他的数据库,这就造成了事务的复杂性。
但是分布式对比传统事务一个是刚性事务,一个柔性事务:有时间弹性,达到最终一致性。

比对传统事务

 分布式理论

cap理论

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

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

、- Partition tolerance (分区容错性):Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。

Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务。容忍出现分区的问题。

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

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

base理论

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

他有三个思想:

Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。譬如电商大促,为了应对大流量,暂时停止注册服务,这时注册服务就不可用,但是整个系统是可用的,所以叫基本可用

Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。

比如订单状态:待付款、已付款待发货、已发货、已签收、已结束

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

分布式事务解决思路:

 

 

标签:事务,读取,幻读,隔离,提交,数据,传统,分布式
From: https://www.cnblogs.com/liu1234567890/p/17732198.html

相关文章

  • 详解分布式系统核心概念——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还包括很多相关的项目和子......
  • 分布式操作系统是操作系统的终极形态吗?​
    昨天一位网友私信我,提出一个问题:“Laxcus分布式操作系统会不会是操作系统发展的终极形态?”。今天觉得有必要把这件事说一说,所以就忙里偷闲写下这篇文章。咱们先说结论:是也不是,需要具体情况具体分析。操作系统发展到今天,基本分为两种:面向个人工作的操作系统,和面向企业业务的操作系统......
  • MySQL事务死锁问题排查
    一、背景在预发环境中,由消息驱动最终触发执行事务来写库存,但是导致MySQL发生死锁,写库存失败。com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:rpcerror:code=Aborteddesc=Deadlockfoundwhentryingtogetlock;tryrestartingtransaction(er......
  • 【北亚企安数据恢复】Ceph分布式存储基本架构&概念&Ceph数据恢复流程
    Ceph存储基本架构:Ceph存储可分为块存储,对象存储和文件存储。Ceph基于对象存储,对外提供三种存储接口,故称为统一存储。Ceph的底层是RADOS(分布式对象存储系统),RADOS由两部分组成:OSD和MON。MON负责监控整个集群,维护集群的健康状态,维护展示集群状态的各种图表,如OSDMap、MonitorMap、......