首页 > 数据库 >[Mysql]隔离级别

[Mysql]隔离级别

时间:2024-07-12 15:53:31浏览次数:14  
标签:事务 隔离 READ 脏读 提交 Mysql 级别

隔离级别

下面介绍四种因为事务的并发产生的问题:
脏写
假设银行账户中有100元,
有事务A,B
A事务把余额改为200,但还未提交
这时,B事务把余额改为300,提交,
如果A发生了回滚,那么账户余额回到100元,事务B无效。
脏写就是已经提交的事务的写操作因为另一个还未提交的事务的回滚而失去效果,请注意这个失效的事务应该是嵌在另一个事务的中间。

image

脏读
脏读与脏写十分类似,
脏读是因为另一个未完成的事务,发生了回滚,导致已提交的事务读出的数据无效。
继续银行账户的例子,
如果银行账务中有100元,
有事务AB,
事务A首先开启,修改了账户余额为200,这时,
事务B开启,读到账户余额为200,事务B结束。
然后事务A发生了回滚,200这个数字失效,也就是B读到的是一个无效的数字,我们称之为脏读。
(脏读,脏写都是因为可以看到未提交的数据,这些未提交的数据后来消失了)

image

不可重复读
继续之前银行账户的例子,
有事务AB,银行账户中有100元
事务A开启,读出100元,
事务B开启,将100元修改为200元,
这时A又一次读取余额,发现余额竟然是200元。
在一个事务之内,读到了不一致的,我们称之为不可重复读。
不可重复读是因为在一个事务两次读操作的中间有另一个事务进行了写操作。

幻读
与不可重复读十分类似,
但是这次要换一个例子,假设有一个班级的成绩单,其中有10人及格,
开启事务A,读到10人及格,
这时开启事务B,又向成绩表中写入了10条及格的数据,
事务A再次查询及格记录,发现竟然有20人及格。
一个事务两次读取的数据量不一致,我们称之为幻读。
好像出现了幻觉。

隔离性其实比想象的要复杂。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。每种存储引擎实现的隔离级别不尽相同。如果熟悉其他的数据库产品,可能会发现某些特性和你期望的会有些不一样(但本节不打算讨论更详细的内容)。读者可以根据所选择的存储引擎,查阅相关的手册。

下面简单地介绍一下四种隔离级别。

READ UNCOMMITTED(未提交读)
有回滚的风险
在READ UNCOMMITTED 级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)(万一这个未提交的数据后面发生了回滚,那么这次读的数据就是无效的,即脏数据)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED 不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。

READ COMMITTED(提交读)
没有考虑事务发生的先后顺序
大多数数据库系统的默认隔离级别都是READ COMMITTED (但MySQL不是)。READ COMMITTED 满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(nonrepeatable read),(可以看到已经提交的修改,意味着在一个事务的执行过程中,第一次读的数据和第二次读的数据之间可能有另一个事务对这个数据进行了修改并提交,第二次读到的数据就是已经被修改提交的数据)因为两次执行同样的查询,可能会得到不一样的结果。

REPEATABLE READ(可重复读)
REPEATABLE READ 解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。本章稍后会做进一步的讨论。

可重复读是MySQL的默认事务隔离级别

SERIALIZABLE(可串行化)
SERIALIZABLE 是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。

标签:事务,隔离,READ,脏读,提交,Mysql,级别
From: https://www.cnblogs.com/DCFV/p/18298562

相关文章

  • MySQL5.7数据库优化模板
    8核16GMySQL数据库优化模板[client]#password=your_passwordport=3306socket=/tmp/mysql.sock[mysqld]port=3306socket=/tmp/mysql.sockdatadir=/usr/local/mysql/varskip-external-locking#MyISAMkey_buffer_size......
  • 常见的MySQL 索引面试题(超有用)
    在面试中,MySQL索引是一个常见的话题,因为它们对数据库的性能优化至关重要。以下是几个常见的MySQL索引相关的面试题及其解答:1.什么是MySQL索引?有哪些类型?解答:索引是一种用于提升数据库查询速度的数据结构。索引本质上是数据表中一列或多列的有序排列,可以加速数据的......
  • 【java计算机毕设】线上花店销售商城系统java MySQL ssm JSP maven项目代码源码+文档p
    目录1项目功能2项目介绍3项目地址 1项目功能【java计算机毕设】线上花店销售商城系统MySQLssmJSPmaven项目代码源码+文档PPT小组设计代码 2项目介绍系统功能:线上花卉小铺系统包括管理员、用户俩种角色。用户端:1.注册登录:游客填写基础信息,注册成为小铺用......
  • MySQL与Redis优化
    MySQL优化策略:查询优化:使用EXPLAIN分析查询语句,优化JOIN操作,减少子查询和复杂的WHERE条件。索引优化:合理创建索引以加快查询速度,同时避免过度索引导致写性能下降。数据类型优化:使用合适的数据类型,避免冗余和浪费,例如使用TIMESTAMP代替DATETIME。表结构优化:如垂直分割和水平......
  • mysql主从搭建
    主机配置说明:192.168.136.101mysql01centos7.92C4G192.168.136.102mysql02centos7.92C4G 1、源码包下载,下载带boost,不然这个boost有的搞,小白不建议尝试MySQL::DownloadMySQLCommunityServer(ArchivedVersions)2、安装需要的编译包yumi......
  • MySQL入门学习-深入索引.全值匹配
        在MySQL中,索引的全值匹配是指在查询中使用索引列的所有部分进行精确匹配。当查询条件中的列值与索引中的值完全匹配时,MySQL可以使用索引来快速定位和检索数据,从而提高查询性能。    以下是关于全值匹配的一些详细信息:一、概念:  -全值匹配是指在查......
  • MySQL入门学习-深入索引.唯一索引
        在MySQL中,索引是一种用于提高数据库查询性能的数据结构。深入了解索引对于优化数据库操作非常重要。以下是关于唯一索引的相关内容:一、概念:  -唯一索引是一种特殊的索引,它确保表中的某一列或列组合的值是唯一的,不允许出现重复值。二、特点:  -保证数......
  • Windows Defender Credential Guard (WDC) 旨在保护操作系统中的凭据免受攻击和恶意
    WindowsDefenderCredentialGuard(WDC)是一种Windows10和WindowsServer2016及更高版本中引入的安全功能,旨在保护操作系统中的凭据免受攻击和恶意软件的威胁。它通过使用硬件虚拟化技术(如IntelVT-x和AMD-V)来隔离和保护用户的敏感信息,例如NTLM口令、KerberosTicketGrant......
  • MySQL 数据库的 DDL
    备份MySQL数据库的DDL(数据定义语言)语句包括导出数据库结构(如表、视图、触发器、存储过程和函数等),但不包括实际数据。通常使用mysqldump工具进行此类操作。以下是具体的方法:备份DDL1.导出数据库结构(不包括数据)使用mysqldump工具导出数据库结构,可以指定--no-data......
  • MySQL日志详解
    一、前言日志文件中记录着MySQL数据库运行期间发生的变化;包括MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等,是MySQL数据库的重要组成部分。MySQL日志分类:错误日志查询日志慢查询日志事务日志(Redolog)二进制日志中继日志二、错误日志默认情况下,错误......