MYSQL:MySQL 事务隔离级别详解

一、MySQL事务是什么?

  MySQL事务是一组在数据库中执行的操作,这些操作要么全部成功执行,要么全部不执行,以确保数据库的完整性和一致性。

事务的 ACID

  事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持续性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

二、MySQL的四种隔离级别

  MySQL中定义了四种事务隔离级别,不同的隔离级别会导致不同的并发执行结果。在实际应用中,需要根据业务的特点选择合适的隔离级别。MySQL的四种事务隔离级别依次为:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

1. 读未提交(Read Uncommitted)

  读未提交是最低的隔离级别,允许一个事务读取并使用另一个事务尚未提交的修改。因此,在该级别下可能会发生脏读问题。

  脏读是指在并发执行的两个事务中,一个事务读到了另一个事务尚未提交的数据。在读未提交的情况下,如果一个事务对数据进行了修改,但是还没有提交,则另一个事务读取该数据时可能会得到错误的结果。这样就会造成脏读问题。

事务A
begin;
update table set name='zbc' where id = 1;事务B
select * from table where id = 1;此时,事务B可能会读到 name列值为'zbc' 的行,而在事务A提交之前,name列实际上是没有被更新的。因此,读未提交级别并不安全,不建议使用。

2. 读已提交(Read Committed)
  在读已提交级别下,一个事务只能读取到已经提交的其他事务所修改过的数据。因此,该级别解决了脏读问题。

但是,在该级别下仍然存在不可重复读和幻读问题。

不可重复读是指在同一个事务中,由于其他事务的干扰,导致同一查询语句返回的结果不同。

事务A
begin;
select * from table where id = 1;A事务还未提交之前,事务B修改了表t1中的数据
begin;
update table set name='ccc' where id = 1;
commit;此时,当事务A再次执行相同的查询语句时,得到的结果已经不同了。

幻读是指在同一个事务中,由于其他事务的干扰,导致同一查询条件下返回的行集合不同。

事务A
begin;
select * from table where name like '%abc%';事务B
begin;
insert into table (name) values ('abcd'), ('bbb');
commit;此时,当事务A再次执行相同的查询语句时,得到的结果已经不同了。因此,针对不可重复读和幻读问题,需要使用更高的隔离级别。

3. 可重复读(Repeatable Read)
  可重复读是MySQL中比较常用的隔离级别,它保证一个事务可以多次读取同一数据,而不会受到其他事务的影响。这种隔离级别可以避免不可重复读问题,但是可能会导致幻读(Phantom Read)问题,即在同一个事务中,两次读取的数据行数不一致。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;START TRANSACTION;SELECT * FROM table WHERE id='1';

4. 串行化(Serializable)
  串行化是最高的隔离级别,它保证所有事务按顺序执行,不允许并发操作。这种隔离级别可以避免脏读、不可重复读和幻读问题,但是会降低并发性能。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;START TRANSACTION;SELECT * FROM table WHERE id='1';

三、MySQL事务隔离级别可能产生的问题

  MySQL的事务隔离级别决定了事务如何与其他并发事务进行交互,并定义了它们能看到的数据版本。不同的隔离级别会对并发控制和数据一致性产生不同的影响。以下是四种常见的事务隔离级别可能产生的问题:

在这里插入图片描述

四、事务隔离级别的应用场景

1. 读未提交(Read Uncommitted)
①.实时数据监控:在某些需要实时查看数据变化的场景中,如股票交易监控,可以接受读取到其他未提交事务的数据,以获取最新的数据变化。

②.性能敏感且一致性要求不高的系统:如果系统对数据的一致性要求不高,且对性能有较高要求,可以考虑使用读未提交级别。

2. 读已提交(Read Committed)
①.大多数Web应用:对于许多Web应用程序,读已提交隔离级别通常足够满足需求。它提供了基本的数据一致性保证,同时允许较高的并发性能。

②.银行ATM交易:ATM交易通常需要确保读取的数据是最新的且已提交的,以避免处理无效或未确认的交易。

3. 可重复读(Repeatable Read)
①.电子商务系统:在电子商务系统中,订单处理和库存管理需要确保数据的一致性。可重复读隔离级别可以防止在处理订单或更新库存时遇到数据不一致的问题。

②.金融交易系统:金融交易系统对数据的一致性要求非常高,可重复读隔离级别可以确保在事务处理过程中数据的一致性。

4. 串行化(Serializable)

①.数据迁移或备份:在进行数据迁移或备份时,需要确保数据的一致性和完整性。串行化隔离级别可以提供最高的数据一致性保证,确保在迁移或备份过程中数据不会被其他事务修改。

②.严格的数据审计场景:在某些需要严格数据审计的场景中,如法律或金融行业,可能需要使用串行化隔离级别以确保数据的绝对一致性。

总结:
  MySQL提供了四种事务隔离级别,它们分别是读未提交、读提交、可重复读和串行化。不同的事务隔离级别采用不同的实现方式,具有不同的优缺点和应用场景。在使用MySQL时,需要根据实际情况选择合适的事务隔离级别,以保证数据的一致性和完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Robotframework+selenium 进行webui页面自动化测试

Robotframework其实就是一个自动化的框架,想要进行什么样的自动化测试,就需要在这框架上添加相应的库文件,而用于webui页面自动化测试的就是selenium库. ​ 关于robotframework框架的搭建我这里就不说了,今天就给大家根据一个登录…

HarmonyOS开发案例:【Stage模型下Ability的创建和使用】

介绍 基于Stage模型,对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability,并使用UIAbilityContext启动另一个Ability,然后借助Want,在Ability之间传递参数,最后我们…

搜维尔科技:数据手套用于外固定虚拟现实模拟 、外固定增强现实模拟

数据手套用于外固定虚拟现实模拟、外固定增强现实模拟 搜维尔科技:数据手套用于外固定虚拟现实模拟、外固定增强现实模拟

【深度学习】最强算法之:Word2Vec

Word2Vec 1、引言2、Word2Vec2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥, help ,help 小鱼: 你这是在鱼塘里面无法呼吸了? 小屌丝:… 别闹,鱼哥, 小鱼…

Dread Hunger 海上狼人杀服务器开服教程

1、购买后登录服务器,百度莱卡云 1.1、第一次购买服务器会安装游戏端,大约5分钟左右,如果长时间处于安装状态请联系客服 2、创建端口 点击网络创建第二个端口作为副端口(副端口的作用是用于第二局游戏,因为游戏BUG&am…

Unity导出的webgl包在浏览器下报错:Unable to parse Build/导出的项目名称.framework.js.gz

先根据链接Unity WebGL项目打包后本地打开报错问题解决方法_unity 打包webgl报错:webassembly.instantiate()-CSDN博客文档操作一番后,在360极速里面兼容模式——黑屏如图: 极速模式:进度条走不满,在谷歌浏览器里面的红色报错文字不出现。 然后打开谷歌浏览器,报如下错:…

Android 上传aar文件到maven仓库 失败问题

之前使用的是maven插件,导致自己的sdk 引用其他远程aar库,找不到类 后期换成maven-publish就解决了 apply plugin: maven-publishdef POM_VERSION 1.0.22 def POM_ARTIFACTID "downloadLibrary"//项目名称id def POM_GROUPID xxxx //项目…

蓝桥杯备战8.快乐的跳

P1152 欢乐的跳 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 刚开始看错题了&#xff0c;没看见要相邻的差 #include<bits/stdc.h> #define endl \n #define int long long using namespace std; const int N 2e710,M 1e310; int a[N],b[N]; signed main() {std::…

如何把握人力RPO的蓝海机遇?实战策略分享!

随着企业间竞争的日益激烈&#xff0c;人力资源管理的重要性愈发凸显。在众多人力资源管理策略中&#xff0c;招聘流程外包(RPO)作为一种新兴的服务模式&#xff0c;逐渐受到业界的关注。那么&#xff0c;人力RPO是否是蓝海项目?我们又该如何实施RPO呢? 一、人力RPO&#xff…

企业微信创建应用(一)

登录到企业微信后台管理(https://work.weixin.qq.com/)进入自建应用(应用管理-应用-创建应用) 3.查看参数AgentId和 Secret 4.企业微信查看效果

极氪速度:70亿市值登陆纽交所,这家纯电豪华品牌开启弹射模式

作者 |老缅 编辑 |德新 北京时间5月10日晚&#xff0c;极氪智能科技在美国纽交所挂牌上市&#xff0c;股票代码为「ZK」。 因获超额认购&#xff0c;极氪扩大了IPO规模&#xff0c;以每股21美元的价格累计发行2100万股美国存托股票&#xff08;每份ADS 对应 10 份普通股&…

【人民网注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

能聚合各站热点的DailyHot

什么是 DailyHot ? 今日热榜&#xff08;DailyHot&#xff09;是一个获取各大热门网站热门头条的聚合网站&#xff0c;能追踪全网热点、实现简单高效阅读。项目分为前、后端&#xff0c;其中后端提供了一个聚合热门数据的 API 接口。 &#x1f6a9; 后端 API 特性 极快响应&a…

中仕公考:应届生身份是怎样界定的?

应届毕业生指在应该毕业的年份即将毕业或者已经毕业学生&#xff0c;应届生参加公务员考试有更大的优势&#xff0c;部分岗位也只对应届生开放。 对应届毕业生的界定&#xff1a; 国家统一招生的高校毕业生离校时和在择业期内未落实工作单位&#xff0c;其户口、档案、组织关…

bestvike--study7之进项目

自学 1.Ajax Ajax (Asynchronous JavaScript and XML) 是一种用于创建动态网页的技术。通过使用 HTML、JavaScript 与服务器端编程语言&#xff0c;Ajax 能够在不需要重新加载整个页面的情况下&#xff0c;更新网页的某部分内容。这使得网页能够更快地响应用户的操作&#xf…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;2&#xff09; 一、springcloudConfig 入门案例&#xff1a;搭建 config 服务端 1、登录 码云&#xff1a;https://gitee.com/ 1&#xff09;点击右上角 【】 再点击【新…

一看就会,liunx中redis 启动并支持远程控制

API对接平台一键对接ChatGPT3.5/4.0&#xff0c;Claude3&#xff0c;文心一言等AI模型&#xff0c;无需翻墙&#xff0c;国外信用卡&#x1f449;AI模型聚合API-海鲸AI 要启动Redis服务并使其支持远程控制&#xff0c;您需要执行以下步骤&#xff1a; 启动Redis服务&#xff1a…

判断对象属性是否存在

前言&#xff1a;在项目的业务逻辑中&#xff0c;有些场景会用到对象属性是否存在的判断。那么就需要我们选择适合业务的判断逻辑。 1. obj.name 通过 obj.name 判断属性是否存在&#xff0c;有个缺陷&#xff0c;就是当属性为 "", undefined, null, 0 时&#xff0…

Java | Leetcode Java题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; class Solution {public void setZeroes(int[][] matrix) {int m matrix.length, n matrix[0].length;boolean flagCol0 false;for (int i 0; i < m; i) {if (matrix[i][0] 0) {flagCol0 true;}for (int j 1; j < n; j) {if (…

浮点数的由来及运算解析

数学是自然科学的皇后&#xff0c;计算机的设计初衷是科学计算。计算机的最基本功能是需要存储整数、实数&#xff0c;及对整数和实数进行算术四则运算。 但是在计算机从业者的眼中&#xff0c;我们知道的数学相关的基本数据类型通常是整型、浮点型、布尔型。整型又分为int8&a…