一文讲清,MySQL事务隔离级别

数据库 MySQL
业务系统在运行的时候,往往有很多线程同时在操作数据库,MySQL也需要多线程的处理多个请求,那么每个事务里的多个SQL语句是如何执行的呢?

业务系统在运行的时候,往往有很多线程同时在操作数据库,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,事务串行执行,根本不会并发执行,所以不会有脏读、不可重复读、幻读这些问题。但缺点也非常明显,就是并发太差了。一般生产环境也不会使用 

责任编辑:庞桂玉 来源: Hollis
相关推荐

2020-04-07 09:21:45

MySQL数据库SQL

2020-04-01 17:26:57

MySQL事务隔离级别数据库

2020-02-21 20:10:13

搞懂事务隔离级别

2018-12-19 16:46:38

MySQL事务隔离数据库

2021-07-26 10:28:13

MySQL事务隔离

2021-08-04 13:19:42

MySQL 事务隔离

2020-10-26 09:18:50

RedisCluste

2022-06-29 11:01:05

MySQL事务隔离级别

2021-11-18 15:08:19

MySQLSQL索引

2009-06-29 17:54:47

Spring事务隔离

2010-11-19 16:13:06

oracle事务隔离级

2019-10-15 10:23:13

服务器MySQL 数据

2023-02-02 07:06:10

2020-10-13 10:32:24

MySQL事务MVCC

2022-06-10 11:51:49

MySQL事务隔离

2021-10-25 15:25:38

MySQL索引数据库

2021-08-30 20:12:11

MySQL事务隔离

2022-09-13 13:49:05

数据库隔离

2021-01-18 11:49:26

面试事务隔离

2018-05-21 07:08:18

行为驱动开发BDD编码
点赞
收藏

51CTO技术栈公众号