一文讲清,MySQL事务隔离级别
业务系统在运行的时候,往往有很多线程同时在操作数据库,MySQL也需要多线程的处理多个请求,那么每个事务里的多个SQL语句是如何执行的呢?
基本都是从磁盘加载数据页到Buffer Pool的缓存页里去,然后更新Buffer Pool里的缓存页,同时记录redo log和undo log。
多个线程并发执行的时候,会有一些问题:
多个事务并发执行,可能会对缓存页里的同一行数据进行更新,这种冲突怎么解决?
有的事务在对一行数据进行更新,另一个事务在对这行数据进行查询,这个冲突怎么解决?
接下来要讲的内容,主要包括多事务并发运行存在的问题、MySQL的事务隔离级别、MVCC多版本控制、锁。
脏读
事务1读取了事务2更新的数据,然后事务2回滚操作,那么事务1读取到的数据就是脏数据。
例如:
张三的工资是8000,现在领导要给他涨工资到10000。
事务1把他的工资改为10000,但事务还没提交。
事务2正在读取张三的工资,独到的是10000。
事务1此时回滚了,张三的工资又变成8000了。
事务2读取到张三的工资10000为脏数据,事务2做了一次脏读。
不可重复读
事务1多次读取同一数据,事务2在事务1多次读取的过程中,对数据作了更新并提交,导致事务1多次读取同一数据时,结果不一致。
例如:
事务1,读取到张三的工资8000。
事务2,把张三的工资改为10000,提交事务。
事务1,再次读取张三的工资,此时工资为10000。
在一个事务中前后两次读取同一个数据的结果不一样,就是不可重复读。
幻读
一个事务用一样的SQL多次查询,每次查询发现查到一些之前没看到过的数据。
比如,目前公司工资为8000的人有10人。
事务1,读取所有工资为8000的人数为10人。
事务2,插入一条工资为10000的记录。
事务1再次读取工资为8000的人,为11人。
此时,事务1出现幻觉似的,同样的SQL查询语句,第一次查出来10人,第二次查出来11人。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
脏读、不可重复读、幻读,数据库并发执行,每个线程可能会开启一个事务,每个事务都会执行crud操作。
数据库并发的执行多个事务,多个事务并发的对缓存页里的同一批数据进行crud,就可能导致脏读、不可重复读、幻读这些问题。
所以,这些问题的本质是,数据库多事务并发问题,为了解决这些问题,数据库设计了事务隔离级别、MVCC多版本控制、锁机制。
事务隔离级别
SQL标准中定义了4种事务隔离级别,就是说事务并发运行的时候,互相是如何隔离的,MySQL默认是可重复读(RR)。
不同的隔离级别是可以避免不同的事务并发问题的。
read-uncommitted(RU),可能会发生脏读、不可重复读、幻读。
read-committed(RC),不会发生脏读,但是会发生不可重复读、幻读
也就是说,事务没提交的情况下修改的值,你是读不到的。但是,一旦事务提交了,你事务就能读到,所以可能你多次读到的值不一样。
repeatable-read(RR),MySQL默认的事务隔离级别,做了大量复杂的工作,解决了脏读、不可重复读、幻读问题,一般生成环境使用这个隔离级别就可以了。
serializable,事务串行执行,根本不会并发执行,所以不会有脏读、不可重复读、幻读这些问题。但缺点也非常明显,就是并发太差了。一般生产环境也不会使用
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
一文讲清,MySQL事务隔离级别相关推荐
- Mysql事务隔离级别及MVCC(多版本并发控制)
一.MySQL事务隔离级别 先注明一点:以下讨论都是在多事务并发的情境下讨论的 事务的特性(InnoDB引擎才有事务): ACID 原子性:一个事务不可再分割,要么都执行要么都不执行 一致性:一个事务 ...
- 5、MySQL事务隔离级别详解
事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...
- mysql 事务 隔离级别_MySQL的四种事务隔离级别
https://www.cnblogs.com/huanongying/p/7021555.html 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的 ...
- mysql事务隔离级别 花_mysql事务隔离级别
很多PHP开发者在面试的时候遇到这个问题都会卡壳.这是因为理解得不够透彻,今天让我带领大家梳理一下mysql事务隔离级别 数据库有四种隔离级别,分别是Read uncommitted,Read com ...
- mysql事务隔离级别之锁实现原理,脏读、不可重复读、幻读出现原因及解决方案
mysql事务隔离级别原理 观看了很多网上的博客,挺令人伤心,很难找到想要的答案... 一:所需知识 1,mysql中的锁 1.1,读锁(共享锁) 规则:若事务1对数据对象A加上读锁,则事务1只能读A ...
- 揭秘Mysql事务隔离级别之可重复读
揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...
- mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客
开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...
- 一文讲清楚MySQL事务隔离级别和实现原理,后台开发人员必备知识
经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...
- Java面试题及答案2019版(下),mysql事务隔离级别原理
答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的 ...
最新文章
- 无需写代码的高颜值富集分析神器
- MySQL学习(四)
- myBatis之事务管理
- android 技能标签功能_iOS和Android用户体验设计差异
- freecodecamp_为什么您一定要参与freeCodeCamp的一个研究小组
- linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍
- 【高校宿舍管理系统】第十章 缺勤管理、报修管理、来访人员管理以及公告管理
- 基于visual Studio2013解决C语言竞赛题之1030计算函数
- 尝试在RHEL6安装Wordpress —— 接触LAMP
- 多摩川读写EEPROM以及并口实现
- 为什么你的温湿度传感器测不准?
- vue中基础理论知识
- MAC电脑如何用苹果电脑微信版实现多开
- 【转载】微信公众平台发展趋势猜想
- mysql 锁(三)
- 微信小程序wxml如何判断字符串中汉语某字符_微信小程序开发经典案例解析“嗨兔儿”...
- CESI: Canonicalizing Open Knowledge Bases using Embeddings and Side Information
- temp = (temp 0x55555555) + ((temp 0xaaaaaaaa) 1)
- 说不清心里对于这个孩子是什么样的感情
- wordpress中如何禁止或者屏蔽更新提示
热门文章
- c#中使用mysql查询语句_遇到@符合怎么办_C# Mysql 查询 Rownum的解决方法
- php隐藏做上传图片,php做图片上传功能
- wxpython显示图片_wxpython下图片局部显示的方法
- linux查看编译器的大小端,Linux系统大小端判断
- 影子卫士和影子系统哪个好用_影子系统是什么?会损害电脑硬盘吗?
- c++ 每半个小时打印一次_有了3D打印机,后期该如何维护呢
- 数据结构之图定义及相关概念
- LeetCode 221 最大正方形
- c++程序设计中文件输入输出流知识点
- Shell离线脚本安装mysql、更新密码