数据库事务——事务隔离级别(代码片段)

流楚丶格念 流楚丶格念     2022-12-07     354

关键词:

文章目录

数据库的事务隔离级别

SQL 标准定义了四种隔离级别,这四种隔离级别分别是:

  • 读未提交(READ UNCOMMITTED);
  • 读提交 (READ COMMITTED);
  • 可重复读 (REPEATABLE READ);
  • 串行化 (SERIALIZABLE)

事务隔离是为了解决脏读、不可重复读、幻读问题,下表展示了 4 种隔离级别对这三个问题的解决程度:

隔离级别脏读不可重复读幻读
READ UNCOMMITTED可能可能可能
READ COMMITTED不可能可能可能
REPEATABLE READ不可能不可能可能
SERIALIZABLE不可能不可能不可能

上述4种隔离级别MySQL都支持,并且InnoDB存储引擎默认的支持隔离级别是可重复读(REPEATABLE READ),但是与标准SQL不同的是,InnoDB存储引擎在REPEATABLE READ事务隔离级别下,使用Next-Key Lock的锁算法,因此避免了幻读的产生。所以,InnoDB存储引擎在默认的事务隔离级别下已经能完全保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别

并发情况下,读操作可能存在的三类问题:

  1. 脏读:当前事务(A)中可以读到其他事务(B)未提交的数据(脏数据),这种现象是脏读。

  2. 不可重复读:在事务A中先后两次读取同一个数据,两次读取的结果不一样,这种现象称为不可重复读。

    脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。

  3. 幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。

    不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。

MySQL的事务隔离级别的实现

InnoDB支持四种隔离级别,每种级别解决掉的问题如下表:

脏读不可重复读幻读幻读
READ UNCOMMITTEDYYY
READ COMMITTEDNYY
REPEATABLE READ(默认)NNN
SERIALIZABLENNN

这四种隔离级别的实现机制如下:

1. READ UNCOMMITTED & READ COMMITTED:

通过Record Lock算法实现了行锁,但READ UNCOMMITTED允许读取未提交数据,所以存在脏读问题。

而READ COMMITTED允许读取提交数据,所以不存在脏读问题,但存在不可重复读问题。

2. REPEATABLE READ:

使用Next-Key Lock算法实现了行锁,并且不允许读取已提交的数据,所以解决了不可重复读的问题。另外,该算法包含了间隙锁,会锁定一个范围,因此也解决了幻读的问题。

3. SERIALIZABLE:

对每个SELECT语句后自动加上LOCK IN SHARE MODE,即为每个读取操作加一个共享锁。因此在这个事务隔离级别下,读占用了锁,对一致性的非锁定读不再予以支持。

MySQL事务小细节

事务可以嵌套吗?

可以,因为嵌套事务也是众多事务分类中的一种,它是一个层次结构框架。有一个顶层事务控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,它控制每一个局部的变换。

需要注意的是,MySQL数据库不支持嵌套事务

如何实现可重复读?如何解决幻读问题?

MySQL的InnoDB引擎,在默认的REPEATABLE READ的隔离级别下,实现了可重复读,同时也解决了幻读问题。它使用Next-Key Lock算法实现了行锁,并且不允许读取已提交的数据,所以解决了不可重复读的问题。另外,该算法包含了间隙锁,会锁定一个范围,因此也解决了幻读的问题

MySQL事务的回滚

在MySQL默认的配置下,事务都是自动提交和回滚的。当显示地开启一个事务时,可以使用ROLLBACK语句进行回滚。

该语句有两种用法:

  • ROLLBACK:要使用这个语句的最简形式,只需发出ROLLBACK。同样地,也可以写为ROLLBACK WORK,但是二者几乎是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

  • ROLLBACK TO [SAVEPOINT] identifier :这个语句与SAVEPOINT命令一起使用。可以把事务回滚到标记点,而不回滚在此标记点之前的任何工作

隔离级别(代码片段)

...用(例如,脏读或幻读)的角度进行描述脏读:也就是当数据库的一个事务A正在使用一个数据但还没有提交,另外一个事务B也访问到了这个数据,还使用了这个数据,这就会导致事务B使用了事务A没有提交之前的数据。不可重... 查看详情

事务的隔离级别(代码片段)

...题就是:脏读现象!这种隔离级别是理论上的,大多数的数据库隔离级别都是二档起步*/读已提交读的时候事务还没有提交,后来事务B提交了,再读的结果不一样就是前后不一致意思不能动态读取/*事务A开启以后,只能读取事务... 查看详情

[中级]深入分析事务的隔离级别(代码片段)

...不同的级别能解决什么样的读现象。并且介绍了在关系型数据库中不同的隔离级别的实现原理。在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性)。由... 查看详情

图解数据库事务的隔离级别(代码片段)

 前言乐观锁和悲观锁与数据库的隔离级别的关系或者两者使用的场景是什么?我在网上所能找到的答案,帮助个人的理解。答案一:事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制... 查看详情

事务隔离级别实现原理(代码片段)

...个事务可以读到另外一个事务未提交的数据。未提交读的数据库锁情况(实现原理)事务在读数据的时候并未对数据加锁。事务在修改数据的时候只对数据增加行级共享锁。现象事务1读取某行记录时,事务2也能对这行记录进行... 查看详情

数据库事务的四大特性以及事务的隔离级别(代码片段)

https://www.cnblogs.com/fjdingsd/p/5273008.html   本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。  如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:⑴原子性(Ato... 查看详情

mysql事务readcommitted隔离级别的数据可见性(代码片段)

模拟MySQL事务ReadCommited已提交读隔离级别数据的可见性。预先创建一张表test,表中只有一个字段state。createtabletest(stateintnotnull)engine=InnoDBcharset=utf8mb4;在两个终端中分别开启两个事务:事务的隔离级别是ReadCommitted结论:在ReadCommitt... 查看详情

初识事务,事务隔离级别,事务传播行为(代码片段)

...引出脏读和幻读的概念。事务什么是事务?事务最开始是数据库中的概念,它把一系列的操作统一为一个整体,这一系列的操作要么同时成功,要么同时失败。一个事务基本的操作是:开启事务如果发生了错误,进行回滚如果没... 查看详情

mysql事务隔离级别(代码片段)

...别可以通过MySQL的视图来实现。读未提交读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下,其他事务进行查询时,直接返回记录上的最新值,... 查看详情

事务并发传播性隔离级别(代码片段)

...读:本节重点在于多线程并发环境下的事务处理、和数据库在并发环境下的表锁和行锁。案例:在新增图书的时候,肯定需要先新增作者。SpringMVC声明式事务事务分两种:编程式事务、声明式事务Connectionconnconn.set... 查看详情

事务隔离级别(代码片段)

...在事务结束后释放。由于每条语句都是单独一个事务,且数据库使用AutoCommit,结果是在执行语句后会自动提交事务。所以如果不主动开启 查看详情

5分钟带你读懂事务隔离性与隔离级别(代码片段)

前言我们在上一章节中介绍过数据库的带你了解数据库中事务的ACID特性的相关用法。本章节主要来介绍下数据库中一个非常重要的知识点事务的隔离级别。如有错误还请大家及时指出~问题:事务的隔离级别有哪些?如果并发事... 查看详情

数据库事务的4大特性与隔离级别(代码片段)

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:⑴原子性(Atomicity)  原子性是指事务包含的所有操作要么全... 查看详情

事务隔离级别(代码片段)

事务隔离级别:了解数据库事务的最重要因素事务是数据库管理系统(DBMS)中一个重要的概念,它能够确保数据库操作的完整性和一致性。然而,如果多个事务同时运行并试图访问同一个数据,即想同时保证并发性和一致性,... 查看详情

mysql原理篇之事务隔离级别和mvcc--13(代码片段)

Mysql原理篇之事务隔离级别和MVCC--13事前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadView... 查看详情

数据库事务的四大特性以及事务的隔离级别(代码片段)

...样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。⑵一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事... 查看详情

mysql事务隔离级别(代码片段)

1.隔离级别1.1理论MySQL中事务的隔离级别一共分为四种,分别如下:序列化(SERIALIZABLE)可重复读(REPEATABLEREAD)提交读(READCOMMITTED)未提交读(READUNCOMMITTED)四种不同的隔离级别含义分别如... 查看详情

mysql事务隔离级别(代码片段)

1.隔离级别1.1理论MySQL中事务的隔离级别一共分为四种,分别如下:序列化(SERIALIZABLE)可重复读(REPEATABLEREAD)提交读(READCOMMITTED)未提交读(READUNCOMMITTED)四种不同的隔离级别含义分别如... 查看详情