一文彻底搞懂MySQL中事务的五种分类

文章目录

  • [1. 什么是事务](#1. 什么是事务)
  • [2. 事务的分类](#2. 事务的分类)
  • [3. 事务的详解](#3. 事务的详解)

1. 什么是事务

事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部成功完成,要么全部失败回滚,从而保证数据库操作一致性和完整性的重要机制,它确保了数据库在并发环境下的正确性和可靠性。

在数据库中,事务是由一组数据库操作组成的逻辑工作单元,这些操作可以是读取数据、写入数据或者同时包含读取和写入操作。事务的四个基本特性通常被称为 ACID:

  • 原子性 (Atomicity):事务是原子性的,这意味着它要么全部执行成功,要么全部失败回滚。在事务中的操作要么全部完成,要么全部撤销,不会出现部分完成的情况。

  • 一致性 (Consistency):事务在执行之前和之后,数据库的状态必须保持一致。这意味着事务的执行不能破坏数据库的完整性约束,即使在发生故障或错误的情况下也是如此。

  • 隔离性 (Isolation):事务的执行过程中,其所做的修改对其他事务是不可见的,直到该事务提交。这保证了并发执行的事务之间不会相互影响,避免了数据不一致性的问题。

  • 持久性 (Durability):一旦事务成功提交,其对数据库的修改就是永久性的,即使系统发生故障或崩溃,这些修改也不会丢失。数据库系统必须能够保证事务的持久性,即使在异常情况下也要能够恢复数据。

2. 事务的分类

从事务理论的角度来看,可以把事务分为以下几种类型

  • 扁平事务 (Flat Transactions):这是最基本的事务类型,它表示一个简单的事务单元,通常由一系列的数据库操作组成,这些操作要么全部执行成功,要么全部失败,具有原子性。

  • 带有保存点的扁平事务 (Flat Transactions with Savepoints):在扁平事务的基础上引入了保存点的概念。保存点是事务中的一个标记,允许在事务执行过程中部分提交或回滚。可以通过设置保存点来实现更灵活的事务控制。

  • 链事务 (Chained Transactions):链事务允许一个事务的提交触发另一个事务的开始。这种类型的事务通常用于需要按顺序执行的一系列操作,其中每个操作都依赖于前一个操作的结果。

  • 嵌套事务 (Nested Transactions):嵌套事务是指一个事务可以包含其他事务,形成嵌套的层次结构。内部事务可以独立于外部事务提交或回滚,但它们的提交或回滚可能会受到外部事务的影响。

  • 分布式事务 (Distributed Transactions):分布式事务涉及多个独立的数据库或系统之间的事务处理。在分布式环境中,确保事务的原子性、一致性、隔离性和持久性是一项挑战,因此需要特殊的机制来处理分布式事务。

3. 事务的详解

1.扁平事务 (Flat Transactions)

  • 这是最简单的事务类型,由一系列操作组成,没有嵌套或分支。
  • 事务从开始到结束都在同一级别,没有额外的控制结构。
  • 当所有操作成功完成时,事务提交;如果任何一个操作失败,整个事务就会回滚。

2.带有保存点的扁平事务 (Flat Transactions with Savepoints)

  • 类似于扁平事务,但允许在事务内设置保存点,以便在事务回滚时部分回滚。
  • 保存点是事务中的一个标记,允许在回滚时将事务还原到该点之前的状态。

3.链事务 (Chained Transactions)

  • 在这种类型的事务中,一个事务的结果会成为另一个事务的输入。
  • 每个事务依赖于前一个事务的结果,因此它们被链接在一起形成一个链。

4.嵌套事务 (Nested Transactions)

  • 这种事务类型允许在事务内部嵌套其他事务。
  • 内部事务的提交或回滚不会影响外部事务,但外部事务的提交或回滚会影响所有嵌套的事务。

5.分布式事务 (Distributed Transactions)

  • 这种事务类型涉及多个独立的数据库或系统之间的操作。
  • 一个分布式事务涉及跨越多个计算机或数据库的操作,并且需要确保这些操作在不同系统之间的一致性和原子性。
  • 通常使用两阶段提交协议 (Two-Phase Commit Protocol) 或三阶段提交协议 (Three-Phase Commit Protocol) 来实现分布式事务的原子性和一致性。
相关推荐
夜泉_ly28 分钟前
MySQL -安装与初识
数据库·mysql
qq_529835351 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New4 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6754 小时前
数据库基础1
数据库
我爱松子鱼4 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo4 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser5 小时前
【SQL】多表查询案例
数据库·sql
Galeoto5 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)6 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231116 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql