业务系统在运行的时候,往往有很多线程同时在操作数据库,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事务隔离级别相关推荐

  1. Mysql事务隔离级别及MVCC(多版本并发控制)

    一.MySQL事务隔离级别 先注明一点:以下讨论都是在多事务并发的情境下讨论的 事务的特性(InnoDB引擎才有事务): ACID 原子性:一个事务不可再分割,要么都执行要么都不执行 一致性:一个事务 ...

  2. 5、MySQL事务隔离级别详解

    事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...

  3. mysql 事务 隔离级别_MySQL的四种事务隔离级别

    https://www.cnblogs.com/huanongying/p/7021555.html 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的 ...

  4. mysql事务隔离级别 花_mysql事务隔离级别

    很多PHP开发者在面试的时候遇到这个问题都会卡壳.这是因为理解得不够透彻,今天让我带领大家梳理一下mysql事务隔离级别 数据库有四种隔离级别,分别是Read uncommitted,Read com ...

  5. mysql事务隔离级别之锁实现原理,脏读、不可重复读、幻读出现原因及解决方案

    mysql事务隔离级别原理 观看了很多网上的博客,挺令人伤心,很难找到想要的答案... 一:所需知识 1,mysql中的锁 1.1,读锁(共享锁) 规则:若事务1对数据对象A加上读锁,则事务1只能读A ...

  6. 揭秘Mysql事务隔离级别之可重复读

    揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...

  7. mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客

    开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...

  8. 一文讲清楚MySQL事务隔离级别和实现原理,后台开发人员必备知识

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...

  9. Java面试题及答案2019版(下),mysql事务隔离级别原理

    答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的 ...

最新文章

  1. 无需写代码的高颜值富集分析神器
  2. MySQL学习(四)
  3. myBatis之事务管理
  4. android 技能标签功能_iOS和Android用户体验设计差异
  5. freecodecamp_为什么您一定要参与freeCodeCamp的一个研究小组
  6. linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍
  7. 【高校宿舍管理系统】第十章 缺勤管理、报修管理、来访人员管理以及公告管理
  8. 基于visual Studio2013解决C语言竞赛题之1030计算函数
  9. 尝试在RHEL6安装Wordpress —— 接触LAMP
  10. 多摩川读写EEPROM以及并口实现
  11. 为什么你的温湿度传感器测不准?
  12. vue中基础理论知识
  13. MAC电脑如何用苹果电脑微信版实现多开
  14. 【转载】微信公众平台发展趋势猜想
  15. mysql 锁(三)
  16. 微信小程序wxml如何判断字符串中汉语某字符_微信小程序开发经典案例解析“嗨兔儿”...
  17. CESI: Canonicalizing Open Knowledge Bases using Embeddings and Side Information
  18. temp = (temp 0x55555555) + ((temp 0xaaaaaaaa) 1)
  19. 说不清心里对于这个孩子是什么样的感情
  20. wordpress中如何禁止或者屏蔽更新提示

热门文章

  1. c#中使用mysql查询语句_遇到@符合怎么办_C# Mysql 查询 Rownum的解决方法
  2. php隐藏做上传图片,php做图片上传功能
  3. wxpython显示图片_wxpython下图片局部显示的方法
  4. linux查看编译器的大小端,Linux系统大小端判断
  5. 影子卫士和影子系统哪个好用_影子系统是什么?会损害电脑硬盘吗?
  6. c++ 每半个小时打印一次_有了3D打印机,后期该如何维护呢
  7. 数据结构之图定义及相关概念
  8. LeetCode 221 最大正方形
  9. c++程序设计中文件输入输出流知识点
  10. Shell离线脚本安装mysql、更新密码