百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

脏读、不可重复读和幻读现象 脏读 不可重复读

qiyuwang 2024-10-08 10:33 12 浏览 0 评论

背景

对于软件开发人员来说,有时候我们需要面对瞬时海量的并发请求,例如阿里双十一等活动,当处理并发流程时需要我们通过各种机制保持数据一致性,其中,最有效的一种机制就是锁机制。而对于数据库管理人员来说,并发问题同样存在。并发问题的本质在于一条逻辑代码在机器层面可能需要几条指令来完成,也就是说这条逻辑代码可能在多个机器周期内完成,如果在顺时执行时这样执行是不会存在问题的,而在并发执行时就会出现数据不一致的情况。这种最小的逻辑指令对应到数据库中就是事务,事务包含原子性(Atomicity)、一致性(Consistency)、一致性(Consistency)和持久性(Durability)。而由于一个事务在机器层面可能需要几条指令完成,这也意味着它在并发时会出现如下问题:脏读、不可重复读和幻读,下面以MySQL为例详细介绍在什么情况下可能会出现上述问题。

Read uncommitted(读未提交)

此事务隔离级别会出现脏读现象*(事务的修改,即使没有提交,其他事务也能看的到),不建议在生产环境中去使用。

实验-> 脏读现象

  • 查看隔离级别

show variables like 'tx_iso%';
  • 修改隔离级别

mysql> set tx_isolation='READ-UNCOMMITTED';

注意:READ-UNCOMMITTED是字符串,如果不使用双引号,就会报错,错误信息如下:

set tx_isolation=READ-UNCOMMITTED;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ-UNCOMMITTED' at line 1
  • 创建表

create table test(int id);//典型的错误,可以和java 类比
create table test(id int);//正确写法
  • session1中新增一条数据,但是没有提交,可以session2却可以查询到session这条最新数据

注意:我们需要手动开启事务(begin)和提交事务(commit),不然MySQL会自动提交事务

Read committed(读已提交)

针对当前读,RC隔离级别保证对读取到的记录加锁(记录锁),存在不可重复读现象(在一个事务内,多次读取,会读取到不同的数据)。

实验-> 不可重复读现象

  • 清除test数据

truncate table test;

我们发现session2中执行两次select * from test会出现不同的结果,这就是不可重复读现象。

Repeatable read(可重复读)

这是MySQL默认隔离级别,解决不可重复读,但是还会出现存在幻读现象。幻读现象就是说当某个会话对某个数据进行修改并提交,而其他会话读取这个数据并不是最新的值。

实验-> 可重复读

session1 session2begin; begin;
 select ;//获得一个时间点快照,在表记录中的每一个行都会有trx_id,以后每次查询,都会查询比这个trx_id小于等于的值
insert;
commit;
 select;

MySQL通过MVCC(解决读写并发问题)和间隙锁(解决写写并发问题)来解决幻读,Repetable Read违反了隔离性,ACID中对隔离性的定义如下:

The isolation property ensures that the concurrent execution of transactions results in a system state that would be obtained if transactions were executed sequentially, i.e., one after the other. Providing isolation is the main goal of concurrency control. Depending on the concurrency control method (i.e., if it uses strict - as opposed to relaxed - serializability), the effects of an incomplete transaction might not even be visible to another transaction

大概意思:一个没有提交的事务对其他事务是不可见的,而提交过的事务对其他事务是可见的。但是Repeatable Read中提交的事务对其他事务是不可见的,显然违反了隔离性。

Serializable(串行化)

串行化解决了脏读、不可重复读、幻读现象,但是效率会比较低下。从MVCC并发控制退化为基于锁的并发控制。不区分快照读与当前读,所有的读操作均为当前读。

相关推荐

Java 环境安装详细指南(java环境安装步骤)

前言...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统...

Ubuntu16.04.1安装Java8(ubuntu安装java的命令)

上篇文章讲解了怎么在Windows下安装Java8《Windows10安装Java8》,这里讲解下怎么在Linux下安装Java。由于之前已经安装了Ubuntu16.04.1《...

Ubuntu 下安装 JDK17(ubuntu安装jdk1.7)

JavaSE17Ubuntu下JDK的安装本文主要针对Ubuntu的环境进行Java17的JDK安装。下载地址:...

Ubuntu安装JDK(ubuntu安装jdk报错)

在Ubuntu系统上安装JDK8u441版本,可以通过多种方式实现,包括使用官方JDK的PPA仓库、下载JDK的.tar.gz文件手动安装,或者使用第三方PPA仓库如WebUpd8。以下是通过JDK...

前端资源-实用的JS插件(前端浏览器插件)

现在前端资源越来越多,有创意十足的,有实用性高的,这些对于设计师和前端人员来说都是不错的灵感和资源,所以我们可多关注这些信息,对自己的专业技术有也会帮助的。今天设计达人网为大家分享有:页面进度条、图像...

图片延迟加载,你会使用吗?给你推荐几款插件,快来学习吧

图片延迟加载延迟加载就是当真正需要的时候,才执行加载操作。延迟加载作为Web前端性能优化的一种措施,已经越来越多的应用到各种程序中,而图片的延迟加载作为使用是最广泛的一种,更应该被我们掌握,今天我就给...

突发!Vite 插件惊现图片处理黑科技

【AlarmLevel】趣味【AlarmTitle】突发!Vite插件惊现图片处理黑科技【AlarmOverview】就在昨天,GitHub上一款名为vite-plugin-imagemi...

盘点前端程序员制作网站的常用工具

网站制作时,为了能够更快速、高效地完成任务,往往需要网站制作工具来进行辅助。尤其是前端程序员,五花八门的网站制作工具。今天就来盘点前端程序员一般开发网站程序时使用的那类网站制作工具。...

MyBatis 插件原理与实战(mybatis好用的插件idea)

文章导读MyBatis插件原理与实战什么是插件?...

VisBug:助力前端开发的浏览器插件

作为前端开发者相信肯定有遇到过以下场景:...

前端插件-unplugin-auto-import真的香香

没用这个插件前:你在Vue3中写了50个组件,每个文件开头都要重复这堆代码:import{ref,computed}from'vue'import{useRoute,...

VSCode中值得推荐的常用的16个高效前端插件「主题篇」(一)

VSCode是我们前端开发的一个强大的IDE,所以选择趁手好用的插件是提高开发效率,然后剩下的时间用来摸鱼是很有必要滴。主题篇(16)VSCodeGreatIcons...

支持快速集成的前端网站反馈小插件

大家好,我是章鱼猫。...

很香的几款开源免费的流程设计器(开源流程图设计器)

1、LogicFlow(1)介绍:LogicFlow是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻...

取消回复欢迎 发表评论: