首页 > 其他分享 >分布式事务解决方案(一):事务的基本概念

分布式事务解决方案(一):事务的基本概念

时间:2024-10-17 10:49:38浏览次数:11  
标签:事务 读取 隔离 幻读 并发 级别 基本概念 分布式

如果你觉得这篇文章对你有帮助,请不要吝惜你的“关注”、“点赞”、“评价”、“收藏”,你的支持永远是我前进的动力~~~

一、事务的基本概念

事务是确保数据库操作一致性的重要机制,而根据其涉及的资源和系统结构的不同,可以分为本地事务和分布式事务两种类型。

  1. 事务:访问并更新数据库中各种数据项的一个程序执行单元。同属于一个事务的一系列操作是不可分割的,要么全部执行成功,要么根本不执行。
  2. 本地事务:基于单一服务、单一数据库资源访问的事务,被称为本地事务,也称为传统事务。例如LAMP(Linux+Apache+MySQL+PHP)架构中的事务就是本地事务。
  3. 分布式事务:是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点上。这种情况下,需要保证跨多个节点的操作的一致性和原子性 -- 百度百科。

二、事务的四大特性

事务的四大特性通常被称为ACID,它们分别是:

  1. 原子性(Atomicity)
  • 事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。这意味着事务的操作要么全部成功,要么全部失败,不会处于中间状态。如果事务中的某一部分操作失败,那么事务中的所有操作都会被撤销,数据库状态将回滚到事务开始之前。
  1. 一致性(Consistency)
  • 事务必须使数据库从一个一致性状态转移到另一个一致性状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。例如,在转账事务中,从一个账户转出金额,必须在另一个账户中相应增加金额,保持总金额不变。
  1. 隔离性(Isolation)
  • 并发执行的事务之间不会相互影响。一个事务的执行不会被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都像是在独立的环境中操作,事务的中间状态对外是不可见的,直到事务提交。
  1. 持久性(Durability)
  • 一旦事务提交,它对数据库中数据的改变就是永久的。即使发生系统故障,这些改变也不会丢失。通常,这意味着事务一旦提交,就会被写入到某种持久存储介质中,如磁盘。

这四大特性保证了数据库在执行事务时的可靠性和稳定性,是关系数据库管理系统(RDBMS)中事务处理的基础。

三、事务的隔离级别

事务的隔离级别定义了事务在并发执行时,对其他事务可见的程度。SQL标准定义了以下四种隔离级别,从低到高分别是:

  1. 读未提交(Read Uncommitted)
  • 允许读取尚未提交的数据变更。可能会导致脏读(Dirty Reads),即一个事务可以读取另一个事务中尚未提交的数据。
  1. 读已提交(Read Committed)
  • 仅允许读取已经提交的数据变更。这是大多数数据库系统的默认隔离级别(例如 SQL Server 和 PostgreSQL)。它可以避免脏读,但不可重复读(Non-Repeatable Reads)和幻读(Phantom Reads)仍然可能发生。
  1. 可重复读(Repeatable Read)
  • 确保在事务内可以多次读取同样的数据结果,而不会受到其他事务的影响。MySQL 在默认的存储引擎 InnoDB 中使用的就是这种隔离级别。它可以避免脏读和不可重复读,但幻读仍然可能发生。
  1. 串行化(Serializable)
  • 最高级别的隔离,强制事务串行执行,即事务只能一个接一个地执行,不能并发执行。这可以完全避免脏读、不可重复读和幻读,但会极大地降低系统的并发性能。

四、只读事务

这里需要特别提及“只读事务”,有着其独特的作用。只读事务(Read-Only Transaction)是一种特殊类型的事务,它只允许执行查询操作,不允许执行任何修改数据库状态的操作,如插入、更新或删除。以下是只读事务的一些主要作用:

  1. 提高性能
  • 由于只读事务不需要考虑数据修改,数据库系统可以优化查询操作,减少锁的竞争和开销,从而提高查询的执行速度。
  1. 保证数据一致性
  • 只读事务可以确保在事务执行期间看到的数据是一致的,即使其他事务正在修改数据,只读事务也会看到事务开始时数据库的一致性快照。
  1. 简化数据备份和复制
  • 在进行数据备份或复制操作时,使用只读事务可以确保备份或复制的数据不会因为并发修改而出现不一致。
  1. 避免副作用
  • 只读事务可以防止执行查询时意外修改数据,这对于维护数据完整性和防止误操作非常有用。
  1. 提供隔离性
  • 只读事务可以设置不同的隔离级别,以控制对其他事务的可见性,例如,可以设置串行化隔离级别,确保事务完全不受其他事务的影响。
  1. 优化资源分配
  • 数据库系统可能会为只读事务分配不同的资源,例如,将它们调度到不同的处理队列中,以优化整体资源的使用。

五、并发事务带来的问题

并发事务在数据库管理系统中是常见的,因为它们允许多个操作同时进行,提高了系统的吞吐量和资源利用率。然而,并发事务也可能带来以下问题:

  1. 更新丢失(Lost Updates)
  • 当两个或多个事务同时更新同一数据项时,后一个事务的更新可能会覆盖前一个事务的更新,导致前一个事务的更新丢失。
  1. 脏读(Dirty Reads)
  • 当一个事务读取了另一个未提交事务修改的数据时,如果那个事务最终回滚,那么第一个事务读取的数据就是无效的。
  1. 不可重复读(Non-Repeatable Reads)
  • 在同一个事务中,多次读取同一数据集合时,由于其他事务的修改,导致每次读取的结果不一致。
  1. 幻读(Phantom Reads)
  • 在同一个事务中,第一次查询的结果集与第二次查询的结果集不同,因为其他事务插入了新的行或者删除了已有的行。
  1. 死锁(Deadlocks)
  • 两个或多个事务相互等待对方释放锁,导致所有事务都无法继续执行。
  1. 饥饿(Starvation)
  • 某个事务因为优先级低或其他原因,长时间无法获取所需的资源,导致无法正常执行。

这里重点说明下“不可重复读”和“幻读”的区别。

不可重复读(Non-Repeatable Read)和幻读(Phantom Read)都是数据库事务隔离级别中的问题,它们都涉及到事务在执行期间读取到的数据不一致的情况,但它们关注的点不同。

不可重复读

  • 不可重复读关注的是在一个事务内,多次读取同一行数据时,得到的结果不一致。
  • 这种情况通常发生在以下场景:事务A读取了一行数据,然后事务B修改了这行数据并提交,事务A再次读取这行数据时,发现数据已经被修改了。
  • 不可重复读的重点在于“同一行”数据的改变。

幻读

  • 幻读关注的是在一个事务内,多次执行范围查询时,得到的结果集不一致。
  • 这种情况通常发生在以下场景:事务A执行了一个范围查询,获取了某些行的数据,然后事务B插入了新的行到这个范围,并且提交了。当事务A再次执行同一个范围查询时,它会发现多出了之前没有看到的行。
  • 幻读的重点在于“新行”的出现,即事务在查询过程中看到了之前没有看到的行。

简单来说,区别在于:

  • 不可重复读是读到了已经存在的数据的改变。
  • 幻读是读到了新插入的数据。

六、并发事务问题对应的隔离级别

这个表格展示了MySQL数据库中的事务隔离级别与几种常见并发问题的关系。具体来说,它列出了四种不同的事务隔离级别(读未提交、读已提交、可重复读、可串行化)以及在这些隔离级别下是否可能出现脏读、不可重复读和幻读这三种并发问题的情况。

  1. 读未提交:在这个隔离级别下,一个事务可以读取另一个未提交事务的数据。因此,可能会出现脏读、不可重复读和幻读。
  2. 读已提交:在这个隔离级别下,一个事务只能读取已经提交的其他事务的数据。这样可以避免脏读,但仍然可能发生不可重复读和幻读。
  3. 可重复读:这是InnoDB存储引擎默认的隔离级别。在这个隔离级别下,一个事务在整个执行过程中看到的数据是一致的,即使其他事务在中间进行了更改。这样可以防止脏读和不可重复读,但是仍有可能发生幻读。
  4. 可串行化:这是最高的事务隔离级别,通过强制事务序列化执行来保证数据的一致性。在这种隔离级别下,所有事务都是顺序执行的,从而避免了所有的并发问题,包括脏读、不可重复读和幻读。

此外,图片下方还提到了一些关于MVCC多版本并发控制的信息:

  • 快照读:select操作不会更新版本号。
  • 当前读:insert、update、delete会更新版本号,是当前读。
  • MVCC机制 + 间隙锁 + 临键锁 可以在一定程度上解决了幻读问题。

这些信息有助于我们更深入地理解MySQL如何处理并发控制和事务隔离。

标签:事务,读取,隔离,幻读,并发,级别,基本概念,分布式
From: https://blog.csdn.net/u013469646/article/details/142968589

相关文章

  • 审批流涉及的基本概念
    审批的流程类型串行流程并行流程混合流程串行流程串行流程就是审批流程是依次进行的,前后存在依赖关系,前一流程没有结束,后一流程无法进行。并行流程并行流程是指某个审批节点的不同审批人之间存在平行关系,具体的平行关系可分为:会签(并签)、或签(竟签)会签指的是所有审批人......
  • 一步步优化Redis实现分布式锁
    分布式锁概念在多线程的程序里,为了避免同时操作一个共享变量产生数据问题,会加一个互斥锁,以确保共享变量的正确性,使用范围是同一个进程。那如果是多个进程,需要同时操作一个共享资源,如何互斥呢?比如,现在的业务基本上都是微服务架构,一个应用会部署多个进程,这多个进程需要修改......
  • 什么是分布式锁?Redis的分布式锁又是什么?
    什么是分布式锁?分布式锁是一种用于解决分布式系统中多节点对共享资源并发访问问题的机制。在分布式系统中,多个服务器实例或服务进程可能同时操作某个共享资源(如数据库记录、缓存条目、文件等),导致数据不一致或竞争条件。分布式锁可以确保同一时刻只有一个节点可以访问或修改......
  • 分布式锁-redis实现方案
    分布式锁的定义        分布式锁(DistributedLock)是分布式系统中的一种同步机制,用于控制对共享资源的访问。在分布式环境中,由于多个服务实例或进程可能同时运行在不同的服务器上,传统的单机锁机制(如Java中的synchronized关键字或ReentrantLock)无法跨进程或跨服务器工作......
  • 【Linux】解锁线程基本概念和线程控制,步入多线程学习的大门
    目录1、线程初识1.1线程的概念1.2.关于线程和进程的进一步理解1.3.线程的设计理念1.4.进程vs线程(图解)1.5地址空间的第四谈2.线程的控制:2.1.关于线程控制的前置知识2.2创建线程的系统调用:这个几号手册具体代表的什么含义?2.3.线程终止我们怎么没有像进程一样获取线程......
  • 基于SSM班级事务管理系统的设计
    管理员账户功能包括:系统首页,个人中心,学生管理,班委管理,班会组织管理,健康档案管理,党员发展管理,党员培训管理,学生成绩管理班委账号功能包括:系统首页,学生管理,学生成绩管理,活动信息管理,班费通知管理开发系统:Windows架构模式:SSMJDK版本:JavaJDK1.8开发工具:IDEA(推荐)数据库版本......
  • 图形用户界面-GUI的基本概念和组件之一
    前言        GUI(GraphicalUserInterface,图形用户界面,简称图形界面)编程实际是引用java.awt或javax.swing类包中的窗口类、控制组件类、布局类、事件类等,通过将控制组件类,如菜单、按钮、文本框等,直接或间接添加到窗口中,通过鼠标即可进行操作的图形化界面设计方法。ja......
  • MySQL 事务隔离级别实现原理
    InnoDB有两种读取数据的方式快照读/一致性读,MVCC当前读,获取读写锁后读取行的最新数据InnoDB用一致性读视图实现了MVCC,用于支持读已提交和可重复读隔离级别的实现。启动事务时立即创建视图starttransactionwithconsistentsnapshot快照读快照读/MVCCInnoDB每个事......
  • 基于粒子群算法的分布式电源配电网重构优化matlab仿真
    1.课题概述基于粒子群算法的分布式电源配电网重构优化。通过Matlab仿真,对比优化前后1.节点的电压值 2.线路的损耗,这里计算网损3.负荷均衡度4.电压偏离5.线路的传输功率6.重构后和重构前开关变化状态2.系统仿真结果15.0000+0.0000i14.9761+0.0002i14.8564+......
  • 单链表的基本概念
    单链表的定义typedefstructLNode{intdata;structLNode*next;//定义一个指向结构体自身的指针,用来指向下一个节点}LNode,*LinkList;_____________________________________________LNode*p=LinkListp;//两种定义指针的形式,侧重点不......