版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/89739475

文章目录

  • 一、不可重复读概述
    • 1、事例
    • 2、分析
  • 二、演示不可重复读
    • 1、新建一个数据库(bank库),并准备一张表(account表)
    • 2、打开两个窗口,并分别设置自动提交方式为off
    • 3、将A窗口的隔离级别设置成 “读已提交”
    • 4、两个窗口分别开启事务
    • 5、在B窗口更改数据,并提交事务
    • 6、分别在数据库和A窗口中查看数据

在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 不可重复读 问题。

一、不可重复读概述

不可重复读 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B 在 事务A 提交前读到的结果,和在 事务A 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。
 
隔离级别 有四种,分别是:读未提交、读已提交、可重复读、序列化。
  读未提交: Read Uncommitted,顾名思义,就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。
  读已提交: Read Committed,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。
  可重复读: Repeatable Read,就是在开始读取数据(事务开启)时,不再允许修改操作 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。
  序列化: Serializable,序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
 
大多数数据库默认的事务隔离级别是 Read Committed,比如 SQL Server , Oracle。但 MySQL 的默认隔离级别是 Repeatable Read。

1、事例

程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务并提交完)。程序员就会很郁闷,明明卡里是有钱的…

2、分析

在这个事例中,涉及到了两个事务(程序员事务和妻子事务),当程序员事务开启时,收费系统读取程序员卡里钱的操作还没完成,此时妻子这个事务就将卡里的钱进行了转账,即对数据进行了修改,导致收费系统两次读取到的数据不一样。出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读,这是由于数据更新导致的,不能重复读取相同的数据。


二、演示不可重复读

1、新建一个数据库(bank库),并准备一张表(account表)

2、打开两个窗口,并分别设置自动提交方式为off

show variables like 'autocommit';   – 查看当前的自动提交是否开启

set autocommit = off;   – 将自动提交关闭

3、将A窗口的隔离级别设置成 “读已提交”

select @@tx_isolation;   – 查询当前的隔离级别

set session transaction isolation level read committed;   – 设置当前会话隔离级别为“读已提交”

4、两个窗口分别开启事务

start transaction;   – 开启事务 或 begin; 也可以显式开启事务

5、在B窗口更改数据,并提交事务

use bank   – 切换到bank数据库

update account set money = money - 100 where id = 1;   – 修改account表中id为1的money字段数据

commit;   – 提交事务

6、分别在数据库和A窗口中查看数据

select * from account;   – 查看account中的全部数据

大家会发现数据库和A窗口中的数据都发生了改变,因为B窗口已经提交了事务,所以数据库中的数据发生改变,是属于正常现象。但是这种事务的隔离性似乎不是太好(事务的隔离性是一个事务的执行,不受其他事务的干扰),你看,B窗口提交了事务,影响到了A窗口中数据,这种隔离级别虽然解决了 ”脏读“ 问题,但是还会引发 “不可重复读”、“幻读”及“丢失更新” 问题,有关 “幻读”及“丢失更新” 的问题请参考后续博客。

有关事务的知识可以参考我之前写的博客《【Spring4.0笔记整理十七】Spring事务详解》 及 【Spring4.0笔记整理十八】Spring事务管理详解 。

博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!

MySQL事务之不可重复读问题相关推荐

  1. 正确理解MYSQL事务的可重复读RR隔离级别与锁

    1,mysql默认的事务隔离级别是可重复度. 可重复度就是在一个事务中对相同数据的多次查询将返回相同结果. 比如 事务1: BEGIN; SELECT age from student where i ...

  2. MySQL事务的不可重复读

    不可重复读--NON-REPEATABLE READ 是指事务中,两次查询的结果不一致,原因,在查询的过程中,其他事务做了更新的操作 脏读,是读取了前一个事务,未提交的脏数据 不可重复读,是在事务内重 ...

  3. mysql读提交和重复读区别_读已提交和可重复读的区别 命令行测试

    可重复读:两个事务进行数据操作他们是互不干扰的 ,事务先A进行数据查询,事务B进行一次事务修改并进行数据提交,事务A再进行一次查询,数据是不改变的. 读已提交:两个事务进行数据操作,事务先A进行数据查 ...

  4. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?

    1. 事务的隔离级别 1.1 read uncommited:读未提交.一个事务读到了另一个事务未提交的脏数据,称之为脏读. 1.2 read commited:读已提交.解决了脏读问题,但当前事务两 ...

  5. MySQL 乱七八糟的可重复读隔离级别实现

    点击上方"芋道源码",选择"置顶公众号" 技术文章第一时间送达! 源码精品专栏 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 ...

  6. mysql 快照_Mysql可重复读(2) —— 快照真的就是快照吗

    上一讲最后抛出了一个问题,Mysql可重复读的"快照"到底是啥? 是对当前数据的全量拷贝吗?每开启一个事务,都要把当前数据库的数据拷贝一份出来? 很明显不是. 一方面,这样做太消耗 ...

  7. Mysql如何实现可重复读

    首先对于mysql来说相信也并不陌生,mysql默认的事务的隔离级别是3,即可以实现可重复读,那mysql又是怎样实现可重复读的呢? 下边进行简单的介绍 这里就要提到了mvcc,即多版本并发控制 首先 ...

  8. MySQL脏读、不可重复读、幻读

    事务的特性: 原子性:指处于同一个事务中的多条语句是不可分割的. 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态.比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K. 隔离 ...

  9. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  10. mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

最新文章

  1. Android Gallery组件详解(转)
  2. python写一个表白程序-用Python写一个表白神器让你脱单
  3. 拋棄虛擬機,微軟實驗讓我們在線做(二)
  4. python删除两个excel表中的相同元素_python筛选出两个文件中重复行的方法
  5. 本地java判断zk节点是否存在
  6. mysql冷热备_Mysql的冷备热备(数据备份)
  7. arduino nano 蓝牙_贸泽开售结合蓝牙5.2与USB 2.0的 Nordic Semiconductor nRF52820多协议SoC...
  8. Thread线程notify方法的自我理解
  9. 厉害了!3分钟搞定开发部署,这个霸榜的AI开源项目大公司都在用
  10. 区块链的开源资料 Hyperledger Fabric
  11. Javascript 调用MSAgent
  12. 基于最新导则下的生态环境影响评价技术方法及图件制作与案例实践
  13. 数字人轻松学习Blender系列之八:建模-2
  14. python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理
  15. Linux4 移植 6410,linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,来日再战!)...
  16. STM32F103_study54_The punctual atoms(STM32 There have always been questions about learning STM32)
  17. 营销科学学会2021年年会揭晓玫琳凯博士论文奖得主
  18. python中 f代表什么_python 中下拉框中的f,v,m是什么意思??
  19. css+html 在文字下面加点。
  20. 旭荣管理软件怎么修改小票内容_【好工具】强烈安利的文献管理软件 Mendeley

热门文章

  1. 使用canvas实现贪吃蛇
  2. 缺少所需的CD/DVD驱动器设备驱动程序
  3. 火焰传感器与 Arduino 连接
  4. Linux:设置文件夹权限之777的含义
  5. 目前世界最穷的国家是哪一个?
  6. 在echarts中使用百度地图扩展,实现在地图上叠加显示栅格热力图
  7. html5页面命名,html命名规范
  8. 第8章 资源管理调度框架YARN
  9. 网站漏洞修复之UEditor漏洞 任意文件上传漏洞
  10. 用HTML/JScript/CSS做一个简单的登录界面