[MySQL]并发执行事物的时候, 都发生了什么?

2023-11-09

1. 目标

        本篇文章最终目标是要熟悉MySQL中事物的四大基本特性(特别是隔离性), 再由事物的隔离性引出在并发这个行为中, 执行事物所出现的几个最主要, 最常见的问题, 同时也引出了在MySQL等的数据库中自带的解决办法.

2. MySQL中事物的四大基本特性

2.1 原子性

        原子性其实是事物最核心的特性. 在事物存在之前, 就银行的转账系统来说, A和B的账户里都是有20, 当A向B转账10, 这时候在数据库中, A的账户余额要先减10, 然后B的账户余额再加10. 正常来说, 这种情况是没毛病的, 但是可能会发生这样一种情况: 当A减10与B加10之间的这一小段时间里面, 机器突然发生宕机, 那么当机器恢复后就会发现 — A中无缘无故少了10, 而B中却一点也没有增加, 针对这样的情况, 数据库中也就引入了事物这个概念.
        事物会把上面这两步操作视为是一个整体, 当其中一方发生异常的时候, 就会回滚(rollback)到执行整体操作. 形如这样把一些操作视为一个密不可分的整体, 我们就称其为事物的"原子性"(因为原子在之前是最小的单位, 象征着密不可分的含义), 这也是事物中最核心的特性.

2.2 一致性

        比如我们在进行数据库提交操作的时候, 经常就会使用到事物, 这样能够保证数据是一致的, 不会出现纰漏等情况.

2.3 持久性

        事物进行的操作都是会写(存储到)磁盘的, 事物一旦提交成功, 造成的修改, 那就是持久化保存的了, 即使对主机重新启动, 也是存在的, 所以说对数据库的改变是永久的, 很好地就体现了持久性.

2.4 隔离性

        数据库中, 在多个事物进行并发执行的时候, 就会产生这种隔离性. 所谓的并发, 就是在多个事物同时执行的时候, 它们彼此之间是会相互产生影响的, 可能会导致执行结果不准确, 甚至是崩溃… 这个时候, 事物的隔离性就会体现出来了, 它的目标就是要阻止多个事物并发执行, 将多个事物之间的影响降低.

3. 并发执行事物出现的问题及解决方案

3.1 什么是并发行为

        上面简单介绍过了, 并发就是在多个事物同时执行的时候, 彼此之间相互产生影响的过程. 虽然上面说, 并发的执行可能会导致数据的不准确现象, 但是并发过程中的效率是非常高的, 实际开发中, 并发是很经常用到的. 总的来说, 并发这种行为是提高执行的效率, 降低数据的准确性的行为.
        其中, 多线程的执行是一种并发的行为, 多客户端来执行事物也是一种并发行为. 本篇文章我们讨论的就是第二种情况.

3.2 并发执行事物出现的问题

3.2.1 问题一: 脏读问题

        一个事物A在执行的过程中, 对其中的一系列数据进行修改, 并且在完成这个事物A(或者提交)之前, 如果有另外一些事物B恰好正在读取这些还没被修改的数据, 由于这些事物B所读取到的数据都是一些临时数据, 与最终事物A完成(或者提交)之后的数据是不一定匹配的(有可能在这些事物B读取完成之后, 事物A可能重新对之前的内容进行了修改). 这样的话, 这些事物B所读到的数据就是脏数据, 类似这种行为就叫做"脏读".

    问题一解决方案:
        我们可以规定说, 在事物A对数据进行修改的时候, 其他一些事物B不能尝试去读取其中的数据, 必须等到事物A完成(或者提交)之后, 才能有权限去访问.
        类似这种操作, 我们就称为"给读操作加锁"操作. 控制其只有在事物A完成后再进行读取数据. 降低了并发程度, 效率降低, 但是隔离性提高了.

3.2.2 问题二: 重复读问题

        当解决了问题一中的脏读问题之后, 虽然规定了在事物对数据修改的过程中其他事物不可以进行读操作, 但是如果出现有一种情况: 当事物A完成(或者提交)了之后, 其他事物B在执行的过程中, 事物A又对其数据进行一次修改, 这时候如果这些事物B再执行的话, 前后两次读取到的数据是会不一样的, 进而导致数据不准确. 类似这种行为就叫做"重复读".

    问题二解决方案:
        由于是在其他事物B执行的时候, 事物A进行修改操作, 导致其他事物B两次读取到数据是不对等的, 这时候我们就可以考虑限制事物A在其他事物B执行的过程中, 不能对其中的这些数据进行修改, 进一步地保证了不会出现重复的现象.
        类似这种操作, 我们就称为"不可重复读操作"操作. 控制了事物A在其他事物B执行的过程中, 不能对其中的数据进行修改操作. 又一次降低了并发程度, 效率再次降低, 但是隔离性得到进一步提高.
        对比"脏读问题"和"重复读问题": "脏读问题"是事物A对数据进行修改的时候, 其他事物B执行所产生问题的过程. 而"重复读问题"是其他事物B在执行的过程中, 事物A对数据进行修改所产生问题的过程.

3.2.3 问题三: 幻读问题

        解决了问题一和问题二带来的问题后, 我们保证了在事物A进行修改数据的时候, 其他事物B不能执行, 同时也保证了在这些事物B执行的过程中, 事物A不能修改其对应的数据. 但是如果有一种情况: 在这些事物B执行的过程中, 事物A对数据进行修改, 但是是没有直接修改这些事物B读取的数据的, 虽然这些事物B读取的最终结果可能没有产生影响, 但是还是会影响到这些事物B读取的结果集, 使得这些事物B两次读取到的结果集是不一样的, 进而导致数据不准确.

    问题三解决方案:
        其实从本质上来说, "幻读问题"是"重复读问题"的一种特殊情况, 我们的解决办法还是和"重复读问题"的解决办法是类似的, 那就是限制事物A在其他事物B执行的过程中, 不进行任何修改操作, 这样就可以完美地保证了不会出现重复的现象.
        类似这种操作, 我们称为"不可幻读"操作. 控制了事物A在其他事物B执行的过程中, 不能对其中的数据进行任何修改操作. 达到隔离性最高, 数据准确性最好的效果, 但是相对应的, 并发程度也会变成最低, 执行效率变得最低.

3.3 总结

        总的来说, 并发与隔离这两种东西相当于是死对头了, 它们往往都是相悖的.
        上面的三个并发执行事物出现的问题是逐渐递进的, 可分为四个"档位", 分别是: (1) 什么都不加以限制 — 这种情况并发程度最高, 隔离性最低; (2) 给读操作加锁操作 — 这种情况并发能力下降一些, 隔离性进一步增加; (3) 不可重复读操作操作 — 这种情况并发能力又进一步下降, 隔离性进一步增加; (4) 不可幻读操作 — 这种情况并发程度最低, 隔离性最高.
        我们在实际开发的过程中, 需要根据实际的场景来去合理地选择上面的档位, 就比如说, 当一些涉及到转账(钱相关)的操作, 就必须使用隔离性最高的操作, 保证数据最为准确; 当一些只是计算观看人数(或者播放量)的操作, 就可以使用并发程度最高的操作, 提高执行效率, 大大降低执行成本.

4. MySQL数据库对应的解决方法

        我们前面知道了并行执行事物出现的各种问题以及对应的解决办法, 那么在MySQL中究竟是如何实现这些解决办法的?
        同样的, MySQL提供了四个"档位"来对应上面说到的四个"档位":
        (1) read uncommitted — 并发能力最强, 隔离性最弱.
        (2) read committed — 解决了"脏读问题", 并发能力下降一些, 隔离性进一步增加.
        (3) repeatable read — 解决了"重复读问题", 并发能力又进一步下降, 隔离性进一步增加.
        (4) serializable — 解决了"幻读问题", 并发能力最弱, 隔离性最强.
        针对不同场景, 我们对MySQL提供的这四个"档位"进行选择, 并在配置文件my.ini中修改数据库的隔离级别. my.ini这个文件也就是之前我们修改默认编码所用到的文件, 还不知道怎么找到这个文件的小伙伴可以看看这篇文章: 对初学MySQL小伙伴的建议(强烈推荐~ 不看后悔~~).
        在my.ini文件里面加上下面这行命令即可指定隔离级别:

#可选参数有:read-uncommitted, read-committed, repeatable-read, serializable.
[mysqld]
transaction-isolation = repeatable-read

        在MySQL中, 默认的隔离级别是repeatable-read, 这也是全局默认的.

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

[MySQL]并发执行事物的时候, 都发生了什么? 的相关文章

  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • 如何导出带有数据的 MySQL 架构?

    我有一个完整的架构 其中有许多表 其中包含 MySQL 查询浏览器中的数据 现在我想将这个包含所有表 数据的完整数据库发送给我的同事 我怎样才能将其发送给我的同事 以便他可以将这个完整的架构放入他的 MySQL 查询浏览器中 Thanks
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • MySQL集群启动失败

    这不是我第一次创建ndbcluster 但我没有收到这样的问题 我正在关注本手册 https hub docker com r mysql mysql cluster by mysql团队 我正在使用回显的默认配置在此 GitHub 存储库
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • MySQL中查找id最大的行

    看一下下面名为 Articles 的 MySQL 表 id articleId version title content 1 1 0 0 ArticleNo 1 title v0 0 ArticleNo 1 content v0 0 2
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • MySQL InnoDB 约束不起作用

    我偶然发现 innoDB 约束的奇怪行为 但找不到原因 我有包含数据的表格 下面列出了它们的结构 CREATE TABLE contents id int 10 unsigned NOT NULL AUTO INCREMENT title
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu

随机推荐

  • 子关卡卸载actor不完全的问题解决。

    在子关卡中 actorA里面挂接n个actor 结果卸载actorA时 挂接的那些actor没有随之卸载掉 解决办法也简单 给这些actor设置owner为actorA即可 即在actorA所在的类里 生成这些挂载的actor时 FActo
  • linux在欢迎界面restart,[Linux]如何手动触发kernel restart

    所谓Linux panic就是碰到错误情况时 code里主动调的一个函数panic 里面出不来 会让cpu重启 不允许再乱执行代码 以便保留现场 像下面这个例子 就是在kernel fault函数里检查到非法无效地址访问后的错误处理 主动调
  • MySQL的服务层和存储引擎层

    1 服务层 Server Layer 服务层是MySQL的顶层组件 负责处理客户端与MySQL服务器之间的交互 它提供了一组API和协议 使应用程序能够连接到MySQL服务器 并发送查询 事务管理 用户权限控制等请求 服务层负责解析和优化查
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • neo4j入门(三) 在数据库已知存在的节点上创建新的边

    from py2neo import Graph Node Relationship from py2neo import NodeSelector graph Graph http localhost 7474 username neo4
  • POJ1753 FlipGame

    分类 状压 暴力枚举 参考博客 https www cnblogs com honeycat p 5176211 html 代码是这位博主原创的 加了点注释 题目 http poj org problem id 1753 1 用16位的in
  • 解决由于找不到xxx.dll,无法继续执行代码的问题

    在用vs写项目 或者你下载github上的C 代码的时候 是不是经常遇到由于找不到xxx dll 无法继续执行代码的问题 其实很简单 解决方法如下 首先 对应于不同的运行模式 debug和release 方法都是一样的 找到你项目目录下 项
  • ctfhub-web-密码口令

    弱口令 先尝试admin password 尝试admin admin 默认口令 一般这种题目都是要去找这个产品的默认密码
  • “卷”资金抢人才,一文看懂国产AI大模型竞争格局|钛度图闻

    神仙打架 大佬 下凡 编辑 刘亚宁 孙骋 作图 初彦墨 策划制作 钛媒体视觉中心 6月29日 美团在港交所发布公告 宣布收购王慧文创办的大模型公司 光年之外 这也给AI大模型市场留下了猜测 不只在国内 ChatGPT的访问量在近期增速下滑
  • QCC300x笔记(2) -- QCC3007芯片入门进阶(二)

    哈喽大家好 这是该系列博文的第二篇 篇 lt lt 系列博文索引 快速通道 gt gt 接着上一篇 这一篇主要讲解如何使用ADK Configuration Tool修改固件的常用配置一 在线模式 Go Configurable Read
  • 用Nginx+Redis实现session共享的均衡负载

    原文地址 https segmentfault com a 1190000004708640 前言 大学三年多 也做个几个网站和APP后端 老是被人问到 如果用户多了服务器会不会挂 总是很尴尬的回答 哈哈 我们的用户还少 到了服务器撑不住的
  • 一条链接获取你的照片【附源码】

    测试链接 https sunpma com other xiangjiquanxian 无论是手机还是pc 都会被获取 请谨慎点击 直接申请获取相机权限 拍照上传到服务器 现在众多手机APP乱用权限并窃取用户隐私 大家要注意保护好自己 代码
  • python实现图书管理系统(课设)

    图书管理系统图书管理系统 某图书馆所藏图书如表1所示 书号 书名 出版社 作者 价格 库存 10001 C语言程序设计 清华大学出版社 张三 51 5 10002 Python程序设计基础 高等教育出版社 李四 45 6 借阅信息如表2所示
  • 判读一个对象不为空_【图表专题】高考地理如何考察 学生图表判读能力?

    本文由 地理雷 综合整理 全国知名地理备考平台 地理图表是地理学科的第二语言 也是地理高考命题的重要载体 图文并茂 无图考图 已成为地理命题的特点 因此 把握正确的图表解读方法 充分挖掘图表信息 是保证顺利解答地理试题的前提条件 也是地理学
  • 同济线性代数教材(第五版)-第3章 矩阵的初等变换与线性方程组

    第3章 矩阵的初等变换与线性方程组 3 1矩阵的初等变换 矩阵的初等变换是一种十分重要的运算 它在解线性方程组的解 求逆阵及矩阵理论的探索中都起重要的作用 消元法解线性方程组 为引进矩阵的初等变换 先来分析仪用消元法解线性方程组的例子
  • 集成电路模拟版图入门-版图基础学习笔记(六)

    今日接着给大家分享模拟版图入门学习笔 六 前几期的学习笔记如下 集成电路模拟版图入门 版图基础学习笔记 一 集成电路模拟版图入门 版图基础学习笔记 二 集成电路模拟版图入门 版图基础学习笔记 三 集成电路模拟版图入门 版图基础学习笔记 四
  • three.js中的矩阵计算

    文章目录 1 概述 2 详论 2 1 行主序与列主序列 2 2 矩阵乘法 3 参考 1 概述 three js中自带了矩阵运算库 不过在使用的过程中总是容易混淆 不知道是行主序还是列主序 前乘和后乘也很容易弄反 就在这里辨析一下 2 详论
  • django 实战(8): 自定义User模型

    1 User模型及其对应的auth user表 我们登录数据库终端界面 查看auth user的表结构 如下 base xxx xxx virtual machine AuthDemo sudo psql U dbuser d authdb
  • matlab 两个球面三维图合并于同一坐标系

    clc clear R1 3 球半径 n1 30 网格大小 n 2 2 n 1 theta1 n1 2 n1 n1 pi phi1 0 0 2 n1 n1 pi 2 cosphi1 cos phi1 cosphi1 1 0 cosphi1
  • [MySQL]并发执行事物的时候, 都发生了什么?

    文章目录 1 目标 2 MySQL中事物的四大基本特性 2 1 原子性 2 2 一致性 2 3 持久性 2 4 隔离性 3 并发执行事物出现的问题及解决方案 3 1 什么是并发行为 3 2 并发执行事物出现的问题 3 2 1 问题一 脏读问