首页 > 其他分享 >脏读,幻读,不可重复读

脏读,幻读,不可重复读

时间:2024-06-14 10:14:40浏览次数:23  
标签:事务 会话 幻读 数据 重复 脏读 提交 级别 READ

案例:

 

操作步骤及解读:

 1 1. 创建数据库: 
 2     create database ceshi;
 3 
 4 2.创建表:
 5     
 6      CREATE TABLE test_table (
 7     id INT PRIMARY KEY,
 8     value VARCHAR(100)
 9  );
10  插入数据
11 INSERT INTO test_table (id, value) VALUES (1, 'yujian');
12 
13 3.查看当前隔离级别
14     当前会话:  SELECT @@session.transaction_isolation;
15     全局:     SELECT @@global.transaction_isolation;
16 
17 4.设置会话就是在当前页面生效,其它页面不生效。我们需要创建两个会话页面。(都是可重复读级别。)
18 
19 5.配置读取未提交级别,两个会话都设:SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
20 
21 脏读:
22     
23     脏读指的是读当前事务读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据。
24 6.首先我们在第一张会话里面创建事务并修改数据:
25     开启事务:START TRANSACTION;
26     修改数据:UPDATE test_table SET value = 'llnb' WHERE id = 1;
27 
28 7.然后我们在第二张会话里可以查到第一张刚刚修改的数据,但是第一张会话的事务并没有提交
29 
30 
31 不可重复读:
32     不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
33 
34 8.我们先回滚一下,回到最初的状态:ROLLBACK;
35 9.在两张会话里面都创建事务:START TRANSACTION;
36 
37 10.在第一张会话里查一下,会发现id为1的字段里是yujian
38 11.然后在第二张会话里修改字段并提交事务:
39     
40     UPDATE test_table SET value = 'llnb' WHERE id = 1;
41     COMMIT;
42 12.对比第一张会话前后两次查询到的数据,会发现两次查询的数据是不一样的。
43 
44 
45 幻读:
46     
47     幻读就是select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入
48 
49 13.先回滚一下:ROLLBACK;
50 14.在一二张会话里开启事务:START TRANSACTION;
51 15.在第一张会话里查询所有记录
52     SELECT * FROM test_table;
53 16.然后在第二张会话里新增第二条记录并提交
54     
55     INSERT INTO test_table (id, value) VALUES (2, 'llnb');
56     COMMIT;
57 
58 17.在第一张会话里查询所有,会发现原本只有一条记录的表多了一条记录

 

补充:

在 MySQL 中事务的隔离级别有以下 4 种:

  1. 读未提交(READ UNCOMMITTED)
  2. 读已提交(READ COMMITTED)
  3. 可重复读(REPEATABLE READ)
  4. 序列化(SERIALIZABLE)

MySQL 默认的事务隔离级别是可重复读(REPEATABLE READ),这 4 种隔离级别的说明如下。

1.READ UNCOMMITTED

读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

2.READ COMMITTED

读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。

3.REPEATABLE READ

可重复读,是 MySQL 的默认事务隔离级别,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read)。

4.SERIALIZABLE

序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

 

补充2:

1.事务相关的常用命令 

  # 查看 MySQL 版本
    select version();

  # 开启事务
    start transaction;

  # 提交事务
    commit;

  # 回滚事务
    rollback;

 

标签:事务,会话,幻读,数据,重复,脏读,提交,级别,READ
From: https://www.cnblogs.com/liuliu1/p/18247232

相关文章

  • 代码随想录 算法训练营 day9 Leetcode151 反转字符串单词 karma55 右旋转字符串 28 实
    Leetcode151反转字符串单词题目链接讲解此题方法很多很重要注重基础解法classSolution{publicStringreverseWords(Strings){char[]initialArr=s.toCharArray();//新字符数组char[]newArr=newchar[initialArr.length+1];//下......
  • c++防止头文件重复
    在C++的头文件中,为了防止重复包含,需要使用预处理指令#pragmaonce或者传统的条件编译方式。下面分别详细说明这两种方式的写法及作用:#pragmaonce使用#pragmaonce指令:#pragmaonce是一种简便的方式,可以确保头文件只被编译一次。在头文件的开头加入#pragmaonce即可,示例......
  • Python实现:查找文本文件中重复的汉字
    查找文本文件中重复的汉字,找到在所在行号文本文件格式大小多少前后左……text.pyimportosimportrelist=[]same=0total=0index=[]withopen("1.txt","r",encoding="utf-8")asf:forlineinf.readlines():line=line.strip('\n......
  • SAP ABAP开发过程中如何高效率从内表中获取不重复记录?
    在SAPERP系统开发过程中,经常会遇到需要将大量数据从数据库表中提取,储存在内表中,供进一步处理之用。而在这个内表中,有时候存在大量重复的记录,若要从中得到唯一记录,有以下三种方法:方法一:内部表循环赋值,使用COLLECT语句追加记录方法二:内部表循环赋值,使用ATNEW和APPEND语......
  • jmeter【配置元件】-【用户定义的变量】与【前置处理器】-【用户参数】变量重复时,引用
    引用前置处理器中的【用户参数】原因:1.线程组下的用户参数优先级>测试计划中的用户定义的变量2.取样器(http请求)下的用户参数优先级>线程组下的用户参数优先级当某个取样器设置了用户参数时,会优先使用该取样器下的用户参数,因为配置元件一般在测试计划开始之前执行,前置处理器在......
  • 脏读:数据一致性问题及解决方案
    目录前言一、脏读的定义二、脏读的原因三、解决脏读的方案四、Demo讲解前言        在多线程或分布式系统中,当多个线程或进程同时访问和修改共享资源时,可能会出现数据不一致的情况。其中一个经典的问题就是脏读。本文将详细介绍脏读的概念、原因和解决方案,帮......
  • 程序员 的 低水平重复 调查
    程序员(或其他人)经常面临(听说)一个痛点:低水平重复。低水平重复,导致职业生涯止步不前,无法取得更好的收益,巨大的成功、走上人生巅峰,遥不可及。本随笔简单列举了程序员的低水平(技能)重复有哪些,以及熟手技能、高手技能(自己认知范围内的)。注意,可用于自评,欢迎补充各级别......
  • //有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?//判断今
    #include<stdio.h>//有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?intmain(){  inti,j,k,num=0;  printf("\n");  for(i=1;i<5;i++)   {     for(j=1;j<5;j++)    {     ......
  • 0080-删除有序数组中的重复项II
    80.删除有序数组中的重复项II给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出......
  • 0026-删除有序数组中的重复项
    26.删除有序数组中的重复项给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题......