事务并发问题及事务隔离级别的学习

2023-11-10

  以下内容都是看的咕泡学院的大神老师讲的一个公开课,就是记录一下。

事务并发带来的三大问题

1、脏读

   如下图,左右两个事务A、B。事务A首先查询id=1的数据,得到age=16之后,事务B对id=1的数据,将age=16更新为age=18,然后事务A,再查询id=1的数据,这种在一个事务里边,多次读取同一条数据,该数据又是在其他事务中未提交的数据,同样的记录,但是得到的结果前后不一致,称为脏读。但是因为是没有提交的数据,将来的某个时间有可能事务B会回滚操作,导致age又重新变成16
在这里插入图片描述

2、不可重复读

   与脏读的差别在于不可重复读是事务B中已经提交了数据。
   不可重复读针对的是更新和删除,即updatedelete。因为修改和删除,是操作的当前数据,并且已提交无法回滚,变化已经定型,已持久化到磁盘,所以叫不可重复读
   如下图,还是左右两个事务A、B。事务A首先查询id=1的数据,得到age=16之后,事务B对id=1的数据,将age=16更新为age=18,并且进行了commit,即提交了。然后事务A,再查询id=1的数据,读取的数据是age=18

在这里插入图片描述

3、幻读

   幻读是针对insert语句,事务A执行一个范围查询,本来只有一条数据,但是经过事务B添加了一条数据后,导致再次查询变成了2条数据。

在这里插入图片描述

   脏读不可重复读的区别在于是否提交,脏读意思是未提交,还没有持久化到磁盘,这种的数据有可能会回滚再变回原来的数据,而不可重复读就在与已提交的数据,以前的数据不可能再读回来的。
   insert带来的问题不属于不可重复读insert并没有动到以前的数据,也就是说数据一致性并没有破坏,是新增数据带来的其他事务读不一致问题。

事务隔离级别

  事务并发带来的三大问题,其实就是数据库读一致性的问题,必须由数据库提供一定的事务隔离机制来解决。
  事务隔离有如下级别,SQL92 ANSI/ISO标准通过定义四种隔离级别,来规范数据库厂商按照该功能提供解决不同级别的事务并发问题。

在这里插入图片描述
  如上图所示,一共有四种隔离级别。分别解决的如下图所示 问题:
在这里插入图片描述
   mysql的InnoDB中默认事务隔离级别是可重复读(Repeatable Read),在InnoDB存储引擎中,可重复读(Repeatable Read)的隔离级别同时也解决了幻读问题。InnoDB 默认使用 RR 作为事务隔离级别的原因,既保证了数据的一致性,又支持较高的并发度。

事务隔离级别的解决方案

  第一种即读取数据前对其加锁,阻止其他事务对数据进行修改,Lock Based Concurrency Control(LBCC)。这种方案导致的问题是,如果有人读取数据,不会允许其他事务进行修改,简单粗暴。

  第二种即生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照提供一定级别(语句级和事务级)的一致性读取。即保证在一定时间内多次读取数据一致。

  InnoDb中对于每行数据其实都隐藏了三个字段:

db_row_id:6字节,行标识
db_trx_id:6字节,插入或更新行的最后一个事务id,自动递增(创建版本号)
db_roll_ptr:7字节,回滚指针(删除版本号)

  对于InnoDb中在两个并发的事物中,每个事务只能查询到创建版本号小于等于自己事务id的,删除版本号大于等于自己事务id的。
  在insert操作时,会递增一个db_trx_id值,因为原则上是只能查询到创建版本号小于等于自己事务id的,因此会在其他事务开启后未提交之前,是查询不到当前新增的数据。
  在delete操作时,当前事务id会递增到db_roll_ptr字段上,因为原则上是查删除版本号大于等于自己事务id的,因此当在某个事务删除记录后,以前开启但未关闭的事务,仍旧会查询到在其他事务已经删除的数据。
  在mysql中update操作相当于insertdelete两个操作。

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

事务并发问题及事务隔离级别的学习 的相关文章

  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • Flask-login:无法理解它是如何工作的

    我试图理解如何Flask Login https flask login readthedocs org en latest works 我在他们的文档中看到他们使用预先填充的用户列表 我想使用数据库存储的用户列表 但是 我不明白其中的一些
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F

随机推荐