MYSQL专题: 脏读、幻读、不可重复读区别及解决方案

2023-11-16

并发场景下事务会存在那些数据问题?

并发场景下mysql会出现脏读、幻读、不可重复读问题;

1. 脏读 dirty read(读到未提交的数据):

A事务正在修改数据但未提交,此时B事务去读取此条数据,B事务读取的是未提交的数据,A事务回滚。

解决办法
方法1:事务隔离级别设置为:read committed。
方法2:读取时加排它锁(select…for update),事务提交才会释放锁,修改时加共享锁(update …lock in share mode)。加排它锁后,不能对该条数据再加锁,能查询但不能更改数据。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。

2.不可重复读 Non-Repeatable read(前后多次读取,数据内容不一致):

	A事务中两次查询同一数据的内容不同,B事务间在A事务两次读取之间更改了此条数据。

解决办法
方法1:事务隔离级别设置为Repeatable read。
方法2:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。

3. 幻读 repeatable read(前后多次读取,数据总量不一致):

在同一事务中两次相同查询数据的条数不一致,例如第一次查询查到5条数据,第二次查到8条数据,这是因为在两次查询的间隙,另一个事务插入了3条数据。

解决办法
方法1:事务隔离级别设置为serializable ,那么数据库就变成了单线程访问的数据库,导致性能降低很多。
Isolation 属性一共支持五种事务设置,具体介绍如下:

DEFAULT: 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .

READ_UNCOMMITTED: 会读到未提交的数据, 出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )。

READ_COMMITTED: 不会读到未提交的数据,会出现不可重复读、幻读问题(锁定正在读取的行)

REPEATABLE_READ :会出幻读(锁定所读取的所有行)

SERIALIZABLE :保证所有的情况不会发生(锁表)。

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

MYSQL专题: 脏读、幻读、不可重复读区别及解决方案 的相关文章

  • 删除除一行之外的所有具有重复值的行

    我有一个包含三列的表 KEY VALUE and LAST UPDATED 有重复的VALUE字段 我想删除所有具有相同的行VALUE和其他人一样except获取最新更新的信息 因此 如果表包含这些行 1 A 2013 11 08 2 B
  • 检测 MySQL 中的 utf8 损坏字符

    我有一个数据库 其中有一堆损坏的 utf8 字符分散在多个表中 字符列表不是很广泛 AFAIK 修复给定的表非常简单 update orderItem set itemName replace itemName 但我无法找到检测损坏字符的方
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • MySQL 错误 1264:列的值超出范围

    As I SETMySQL 中的 cust fax 表如下所示 cust fax integer 10 NOT NULL 然后我插入这样的值 INSERT INTO database values 3172978990 但随后它说 错误 1
  • mysql 中的 max(长度(字段))

    如果我说 select max length Name from my table 我得到的结果是 18 但我也想要相关数据 所以如果我说 select max length Name Name from my table 这是行不通的 我
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • 创建表时 MySQL 语法错误

    我正在尝试在 Filemaker gt MySQL 转换脚本中使用此查询 表创建步骤直接从 phpMyAdmin 导出中获取 并添加到 DROP 语句中 DROP TABLE IF EXISTS artifacts CREATE TABLE
  • Visual Studio 2015:SQL 数据源:无法检索架构。确保 ConnectionString 和 SelectCommand 属性有效

    我有以下ASP Net网页的开发环境 VS 2015专业版 使用 Net Framework 4 0 MySQL服务器5 6 MySQL Net 连接器 6 9 5 MySQL for Visual Studio 2 0 2 我能够从 Vi
  • MySQL 更新具有多个值的查询

    我在数据库中有一个表 其记录如下 match id guess result 125 1 0 130 5 0 233 11 0 125 2 0 我的用户为每场比赛选择一个猜测 我有一个函数可以根据比赛的结果计算猜测的结果 如果猜测正确 结果
  • 使用 Java 连接到 MySql - SSL 连接

    我一直在尝试连接到 MySql 数据库 该数据库使用 ssl 连接与 java 并遇到麻烦 如果任何人可以帮助我 将会有很大的帮助 手动连接MySql 我们使用MySQL Workbench 参数 主机名 test db1 ro xxxxx
  • 用于 Mysql 查询的 FLASK HTML 字段

    你好 Stackoverflow 社区 我是 FLASK 的新手 但是虽然学习曲线非常陡峭 但有一个项目我无法理解 我使用一个非常简单的 HTML 搜索表单 用户在其中输入城市名称 此输入将传递到 Mysql 查询并将输出返回到表中 一切正
  • MySQL 连接最新行

    我有两张桌子agents and calls 座席将始终处于一个活动呼叫中 可能有另一个待处理的呼叫分配给某个座席 而该座席尚未应答 我想编写一个查询来测试最新的调用是否按排序dateCreated与代理表中当前活动的呼叫匹配 以下是当前呼
  • 如何在每次运行 python 程序时添加新列

    我希望我的表的第一列作为卷号 第二列作为名称 每当我运行 python 程序时 我想在表中添加一列日期 在这个新列中 我想填充从 user list 获得的列表将包含值 P A P P 等 如何处理 我尝试首先通过 alter 命令添加一列
  • MySQL Workbench:如何将 mysql 数据库导出到 .sql 文件?

    我需要将 mysql 工作台中的数据库导出到文件 sql 该怎么办 在 MySql Workbench 版本 8 0 中 您只需按照以下步骤操作即可 Go to Server tab Go to 数据库导出 这会打开类似这样的东西 在中选择
  • PHP 插入中的 mysqli_affected_rows

    我有这个代码 if mail to subject message headers insert member sql INSERT INTO members id username VALUES id username insert me
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • 恐慌:拨打 tcp 127.0.0.1:3306:连接:连接被拒绝

    我正在尝试使用 golang gin gorm 从 docker 连接 mysql 服务器 构建本身已经成功 但是如标题所示 出现了以下错误 panic dial tcp 127 0 0 1 3306 connect connection
  • 使用 MySQL 生成唯一且随机的代码数字

    初始目标 我想在表中生成随机且唯一的代码 6 位数字 我使用像这样的 SQL 查询来做到这一点 SELECT SUBSTRING CRC32 RAND 1 6 as myCode FROM codes HAVING myCode NOT I
  • 通过 Join-Where-Group 通过选择查询正确建立索引,避免使用临时;使用文件排序

    我已经搜索了很多关于下面描述的案例的解决方案 但不幸的是我没有找到类似的案例 我有以下场景 作为新用户 该网站拒绝了我的图片 但我可以通过邮件发送它 下面是它的文本表示 Table 1 swap plan Table 2 cell Clus

随机推荐