数据库事务详解:ACID四性、隔离级别、日志、事务控制语句

2023-11-06

数据库中的事务用来管理增、删、改操作,查询不需要事务管理,因为它并不会修改数据库中的数据。

在 MySQL 中只有使用了InnoDB 数据库引擎 的数据库或表才支持事务。

事务的特性

事务具有ACID四性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性

    事务是作为一个整体来执行的,某个事务中的全部操作要么全部成功,要么全部失败。 若事务失败,则数据库状态回滚到事务执行之前。

  • 一致性

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如在银行中两个账户转账前后的储蓄总和不变,这就是从转账前的一致性状态转变为了转账后的一致性状态。保证事务的一致性,就是保证数据库的完整性约束没有被破坏。

  • 隔离性

    数据库中不同事务可以并发执行,但它们各自之间是互不影响的,事务a不会被事务b的操作数据干扰。

  • 持久性

    持久性是指一个事务一旦被提交(commit),它对数据库中数据的改变就是永久性的。

对于事务的原子性,只要将事务作为一个整体去执行就可以了,一荣俱荣,一损俱损;

对于事物的一致性,需要设置数据库的完整性约束,保证数据要服从此约束;

对于事务的持久性,若服务器宕机,此时事务的数据还未进行持久化,会有什么影响呢?已提交的事务,肯定已经持久化到磁盘中,还未提交的事务,相应的数据会回滚。这是为什么,继续往下看到事务日志就明白了。

以上这四种性质,原子性、一致性、持久性都比较容易实现,比较复杂的是事务的隔离性。

事务的隔离级别

为了实现事务的隔离性,InnoDB数据库引擎中提供了4中事务隔离级别:

  • ISOLATION_READ_UNCOMMITTED 读未提交

    读未提交是最低级别的隔离。

    事务A修改了数据D,并且还未提交,当事务B再次查询数据D时,查询到的是事务A修改后的数据D。

  • ISOLATION_READ_COMMITTED 读已提交

    事务A修改了数据D,并且已经提交,当事务B再次查询数据D时,查询到的是事务A修改后的数据D。若事务A未提交,则事务B查询到的数据只能是修改前的数据D。

  • ISOLATION_REPEATABLE_READ 可重复读

    事务A修改了数据D,并且已经提交,当事务B再次查询数据D时,查询到的是事务A修改前的数据D。意思就是事务A对于数据D的修改,在事务B未提交时是不可见的,只有当事务B提交后才能看到其它事务提交的修改。

  • ISOLATION_SERIALIZABLE 串行化

    串行化是最高级别的隔离。事务依次执行,不会产生冲突。

若不适当考虑事务的隔离级别, 在数据库中可能会引发下列问题:

  • 脏读

    一个事务读取了另一个事务修改且未提交的数据。

  • 不可重复读

    一个事务不会读取到另一个事务修改且未提交的数据。

    也就是一个事务可以读取另一个事务修改且已提交的数据。

  • 幻读

    事务A在数据库中插入了一条记录,导致事务B执行期间前后查询到的总记录条数不一致。就像出现了幻觉。

画个表:

脏读 不可重复读 幻读
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED ×
ISOLATION_REPEATABLE_READ × ×
ISOLATION_SERIALIZABLE × × ×

不可重复读:可以理解为有一个数据D,事务执行期间重复读取它,并不能保证每次读取的值都一样。

事务日志

数据库管理系统采用事务日志来保证事务的原子性、一致性和持久性。

如果每次更新都将数据持久化到磁盘,由于数据是随机的,会造成大量的随机IO,性能会非常差;但是如果每次更新不马上写盘,那一旦数据库崩溃,数据就会丢失。为了提高事务中更新操作的效率,MySQL中的大多数存储引擎都实现了事务日志

使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改数据本身持久到磁盘

事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所有采用事务日志的方式相对来说要快得多。

事务日志持久化以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘。目前大多数存储引擎都是这样实现的,我们通常称之为预写式日志 (Write-Ahead Logging),因此修改数据需要写两次磁盘。

如果数据的修改已经记录到事务日志并持久化,但数据本身没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具体的恢复方式则视存储引擎而定。

事务控制语句

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;
  • COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
  • ROLLBACK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  • ROLLBACK TO identifier 把事务回滚到标记点;
  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
  • SET AUTOCOMMIT=0 禁止自动提交
    SET AUTOCOMMIT=1 开启自动提交

参考

https://www.runoob.com/mysql/mysql-transaction.html

https://blog.csdn.net/ncepu_Chen/article/details/94857481

https://zhuanlan.zhihu.com/p/43493165 深入理解数据库事务

https://blog.csdn.net/yinni11/article/details/81510035 事务日志

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库事务详解:ACID四性、隔离级别、日志、事务控制语句 的相关文章

  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 vitess 仅对特定表进行分片

    我创建了一个包含三个表的未分片键空间 现在我想对前两个表的键空间进行分片 但不想对第三个表进行分片 如何才能做到这一点 Vitess 文档不包含任何与此相关的信息或示例 请帮忙 Thanks vitess 中的垂直分片与水平分片类似 您应该
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 内连接不重复,可以吗?

    鉴于这两个表 表 A1 有两行具有相同的值 a A1 a a 表 A2 有两行主键值为 A B 它们与 a 关联 A2 PK col2 A a B a 我想要的是 A1 和 A2 的连接并得到这个结果 a A a B 显然内连接在这里不起作
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • 计算运行总计时出错(之前期间的累计)

    我有一张桌子 我们称之为My Table有一个Created日期时间列 在 SQL Server 中 我试图提取一个报告 该报告显示历史上有多少行My Table按月在特定时间 现在我知道我可以显示有多少added每个月 SELECT YE
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p

随机推荐

  • js基础面试题

    一 值类型与引用类型 1 js如何判断数据类型 值类型 javascript存储数据两个区域 栈 堆 栈 通常空间是固定 堆通常空间是动态的分配 js值类型 名称与值都存储在栈中 var a 15 值类型 var b a 把a的值赋值给 b
  • arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平

    说起来 中国芯的发展史称得上是一部磨难史 因为技术 设备 人才等都被西方国家封锁 就是为了让中国这个大市场巨额进口芯片 但这些年 中国的企业也没有闲着 可以说把世界上的主流的芯片架构尝试了个遍 就是为了找出一台适合自己发展的路来 目前国内的
  • 9款超级实用的网页设计工具,快来看看有没有你用过的

    随着网络时代的快速发展 游戏 购物 音乐 影视和社交网站的兴起都表明了网页设计的重要性 网页设计工具作为网页设计师的生产工具 自然要选择好的 让我们分享9个高质量的网页设计工具 让您的设计效率悄然提高 即时设计 即时设计是一款免费的在线 U
  • 如何选择LDO (LDO的关键指标及定义)

    1 LDO选型关键指标及定义 1 1 输入电压范围 LDO的输入电压范围决定了最低的可用输入电源电压 指标可能提供宽的输入电压范围 最小的输入电压VIN必须大于VOUT VDO 需要注意 这与器件Datasheet中所给出的输入电压最小值无
  • 风格迁移:一文梳理经典方法发展脉络及原理:Gram矩阵、WCT、WCT2

    风格迁移 一文梳理经典方法发展脉络及原理 1 Image Style Transfer Using Convolutional Neural Networks Gram矩阵 CVPR2016 1 1 概述 1 2 方法 2 Deep Pho
  • 代码重定位

    1 程序段介绍 参见博客 C语言程序段的定义 实际应用分析 2 什么是代码重定位 代码重定位就是将代码搬运到链接地址处 实际在操作时就是将代码复制一份到链接地址处 我们把代码下载到设备的Flash中 然后代码运行却要求另一个地址 于是我们就
  • vue图片预览放大,缩小,旋转等功能,用 v-viewer来实现,还有他的api

    前言 推荐一款特别优秀的插件 viewerjs 他可以实现图片预览功能 点击图片实现弹框操作图片的效果 点我进入GitHub地址 实现效果 这里说先下实现步骤 步骤一 安装 注意这里是 v viewer npm install v view
  • Spark函数式编程基础

    目录 一 函数定义与使用 1 函数式编程简介 2 匿名函数 3 占位符语法 4 高阶函数 5 闭包 二 针对容器的操作 1 遍历操作 2 映射操作 3 过滤操作 4 规约操作 5 拆分操作 一 函数定义与使用 1 函数式编程简介 函数式编程
  • maven怎么引入jdom_Maven添加本地依赖

    用mvn命令把本地jar包添加到maven仓库 mvn install install file Dfile f aliyn openservices jar DgroupId com aliyun DartifactId openserv
  • Python:sklearn数据预处理中fit(),transform()与fit_transform()的区别

    1 概述 注意这是数据预处理中的方法 Fit Method calculates the parameters and and saves them as internal objects 解释 简单来说 就是求得训练集X的均值啊 方差啊
  • STM32与拉力传感器通信

    目录 第一部分 设备通信图 第二部分 设备接线 HX711与传感器的接线 HX711与MCU的接线 第三部分 驱动代码 HX711引脚初始化 Dout CLK HX711读取数据函数 HX711获取传感器的值 头文件定义 实验结果 第一部分
  • linux svn 记住密码,Linux(Ubuntu)下保存SVN账户密码-Fun言

    Linux Ubuntu 下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 解决方法1 推荐 不需要修改配置文件 只需要用sudo执行一次svn命令 并记住密码就行了 记住密码需要权限的 sudosvn ci m featur
  • 如何让Chrome浏览器允许http网站打开摄像头和麦克风

    问题来源 本地运行的项目调用摄像头好用 访问线上地址 发现调用摄像头的方法都不存在 问了度娘 发现该问题与浏览器的安全策略有关 出于安全考虑 浏览器是不允许随便开启摄像头的 https协议下方可开启 解决 这一项功能要用到谷歌浏览器的实验性
  • window 安装Hadoop3.0.0

    第一步 Hadoop 官网下载地址 https hadoop apache org releases html 第二步 将下载hadoop 3 0 0 tar gz 解压至指定文件夹 C hadoop 第三步 配置hadoop 涉及环境变量
  • 奇葩问题之奇葩解决方案系列——安卓手机外部加载Assetbundle

    一 前言 首先 这个需求是这么被创造出来的 我们要在安卓手机上加载超过一个G的资源 正常的Unity的程序员都会立马想到使用Assetbundle进行资源打包和加载 我当然也不例外 于是乎我就吭哧吭哧的熟练的对资源进行打包 然后用异步 As
  • vue动态路由的使用

    项目创建过程中经常遇到的一个需求就是权限管理 本文就我在使用动态路由的过程中进行一个总结 首先 前端想要实现对菜单的动态渲染实际上有两种操作方式 1 前端还是书写静态路由表 根据后端传来的code利用v if去判断渲染菜单项 实际这种使用方
  • webpack学习(五):webpack4+压缩和提取CSS以及提取公共部分

    提取 mini css extract plugin what 在过去 如何将 CSS 提取到一个文件中这是 extract text webpack plugin 的工作 不幸的是这个插件与 webpack 4 不太兼容 根据 Micha
  • jquery 的 表单验证

    Http 跳转到 Https Emial 验证 p p
  • Xmind 2020 for Mac(思维导图软件)支持Big Sur V10.3.1中文版介绍

    Xmind ZEN 2020现已改名为Xmind 2020 是一款由XMind官方最新推出的一款功能强大的思维导图软件 XMind 2020的界面经过重新设计 变得非常清爽 软件采用全新的内核 内置多款优秀的字体 ZEN 模式 隐藏页面内多
  • 数据库事务详解:ACID四性、隔离级别、日志、事务控制语句

    目录 事务的特性 事务的隔离级别 事务日志 事务控制语句 数据库中的事务用来管理增 删 改操作 查询不需要事务管理 因为它并不会修改数据库中的数据 在 MySQL 中只有使用了InnoDB 数据库引擎 的数据库或表才支持事务 事务的特性 事