首页 > 数据库 >MySQL事务隔离级别详解及应用指南

MySQL事务隔离级别详解及应用指南

时间:2023-10-15 17:02:47浏览次数:44  
标签:指南 事务 隔离 并发 详解 提交 MySQL 级别 读取

MySQL作为关系型数据库管理系统,对于多个并发事务之间的隔离和并发控制是必不可少的。在MySQL中,提供了四种事务隔离级别,分别是:读未提交、读已提交、可重复读和串行化。

  1. 读未提交

在该隔离级别下,一个事务可以读取另一个并发事务未提交的数据,可能会出现“脏读”问题,即读到了未经授权的数据。这种级别的隔离最大程度地保留了并发性,但是因为缺乏对并发事务对数据修改的完全隔离,因此使用该级别可能会产生一些无法预测的结果。

  1. 读已提交

在该隔离级别下,一个事务只能读取另一个事务已经提交的数据,可以避免脏读问题。在该隔离级别下,由于对于数据的读锁定立即释放,因此其他事务可以在获取到读锁之后立即修改被读取的数据,如果这种情况下,被读取的数据在事务提交前已被修改,则会出现“不可重复读”问题。

  1. 可重复读

在该隔离级别下,一个事务不仅可以读取另一个事务已经提交的数据,还可以读取其他并发事务所持有的共享锁,保证了事务的“可重复读取性”和并发执行性。在该隔离级别下,只有在事务完全提交之后,其他并发事务才能够对其进行修改。

  1. 串行化

在该隔离级别下,所有的事务都必须串行执行,因此可以避免脏读、不可重复读和幻读等问题。该级别会严重影响系统的并发性能,一般不建议使用。

为了更好地理解MySQL中的事务隔离级别,我们以可重复读为例:

在可重复读隔离级别下,事务读取到的数据是固定的,即使其他事务对该数据进行了修改,也不会影响当前事务的读取结果。在该隔离级别下,MySQL通过使用多版本并发控制(MVCC)技术来实现数据的隔离。MVCC基于一种“时间戳”机制,即每个数据都有一个版本号,读取时根据版本号来判断事务是否可以读取该数据。

例如,我们先在表t中插入一条记录,并查询出该记录的id:

INSERT INTO t(name) VALUES('test');
SELECT id FROM t WHERE name='test';

接着,打开另外一个会话,开启一个事务并修改刚才的记录:

START TRANSACTION;
UPDATE t SET name='new_test' WHERE id=1;

此时,回到第一个会话,再次查询该记录的id:

SELECT id FROM t WHERE name='test';

在可重复读隔离级别下,查询得到的结果还是原来的id,因为第二个会话中修改的操作还没有提交。只有当第二个会话提交了事务后,第一个会话才能读到修改后的数据。

以上就是文章所有内容,感谢阅读!

标签:指南,事务,隔离,并发,详解,提交,MySQL,级别,读取
From: https://blog.51cto.com/u_16268194/7872729

相关文章

  • Oracle分区表技术详解
    Oracle是如何存储数据的?逻辑存储与物理存储在国企或者一线大厂,一般都会选择使用Oracle数据库,程序通过mybatis等持久层框架访问Oracle数据库,指定表空间,表空间内包含若干张表,表中存有行数据,行数据以行片段的形式存储在数据库块中,①当插入的行太大,无法装入单个块时;②或因为更新的......
  • TCP/IP协议、三次握手、四次挥手详解
    TCP/IP协议模型(TCP协议)传输控制协议是一种面向连接的、可靠的、基于字节流的方式进行有序的无差错的数据传输通讯协议,它负责完成传输层所指定的功能,利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。比如:数据报检测、流量控制、拥塞控......
  • Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
    场景SpringBoot+Mybatis+定时任务实现大数据量数据分表记录和查询:SpringBoot+Mybatis+定时任务实现大数据量数据分表记录和查询_mybatis定时任务创建日表_霸道流氓气质的博客通过以上分表实现的同结构不同表名之间的表,如何将一个表中的数据复制到另一个表中,且将日期字段进行同样的......
  • Python初学者指南:一步一步学习编程
    引言:欢迎来到Python的世界!Python是一种高级编程语言,以其简洁、易读的代码和广泛的应用领域而闻名。无论你是首次接触编程,还是已经熟悉其他语言,Python都是一个极好的选择。本文将为你提供一个Python的初学者指南,帮助你一步一步开始你的编程旅程。一、为什么选择Python?Python的设计......
  • MySQL错误:check the manual that corresponds to your MySQL server version for the
    在MySQL执行以下SQL报错DELIMITER//CREATEPROCEDUREgenerate_and_insert_data()BEGINDECLAREiINTDEFAULT1;DECLAREjINTDEFAULT1;DECLAREtotal_iterationsINTDEFAULT1000;WHILEi<=total_iterationsDO--创建临时表用于存储生成......
  • Mysql中mvcc实现原理
    Mysql中mvcc实现原理今天我们简单来介绍一下mvcc的实现原理。官方文档的链接也贴在这里官方文档mvcc全称Multi-VersionConcurrencyControl,多版本并发控制,顾名思义是维持了数据库中数据的多版本;这个机制主要是为了服务事务隔离级别中的READCOMMITTED和REPATEABLEREAD两种隔......
  • Python 中 sys.argv 用法详解
    一、Pythonsys模块“sys”是“system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数,而我们今天要讲解的argv就是其中一个函数。二、sys.argv上一篇文章我们讲到了引用模块,这里sys就相当于一个模块,而argv就是......
  • 了解 MySQL 数据库的三大日志(redo log、undo log、binary log)
    前言MySQL中有以下几种日志,包括:redolog(重做日志)undolog(回滚日志)binarylog(二进制日志)errorlog(错误日志)slowquerylog(慢查询日志)generallog(一般查询日志)relaylog(中继日志)事务的特性:原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子......
  • Windows上卸载MySQL 5.1
        完整的卸载MySQL5.1的卸载方法:1、控制面板里的增加删除程序内进行删除2、删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除3、开始->运行->regedit看看注册表里这几个地方删除没有HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\S......
  • Go 代码块与作用域,变量遮蔽问题详解
    Go代码块与作用域详解目录Go代码块与作用域详解一、引入二、代码块(Block)2.1代码块介绍2.2显式代码块2.3隐式代码块2.4空代码块2.5支持嵌套代码块三、作用域(Scope)3.1作用域介绍3.2作用域划定原则3.3标识符的作用域范围3.3.1预定义标识符作用域3.3.2包代码块级......