MYSQL:MySQL 事务隔离级别详解

news2024/11/27 8:22:58

一、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.coloradmin.cn/o/1668902.html

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

相关文章

COX回归特征筛选

任务:利用cox筛选出P值小于0.05的特征 数据的格式第一列为标签,第二列为时间,第三列及后为特征 先想一想,想好了再更新 这里我们先举一个例子: import pandas as pd from lifelines import CoxPHFitter# 创建示例数…

【随笔】Git 高级篇 -- 远程跟踪分支 git checkout -b | branch -u(三十五)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

Github 2024-05-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目5Python项目2非开发语言项目2Vue项目1Rust项目1AFFiNE: 下一代知识库 创建周期:649 天开发语言:TypeScript协议类型:OtherSta…

2024最新最全【NMAP】零基础入门到精通

一、Nmap介绍 Nmap(Network Mapper,网络映射器)是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫描大型网络,包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别、WAF识别及常见安全漏洞。它的图形化界面是Zenmap&#xff…

AJAX前端与后端交互技术知识点以及案例

Promise promise对象用于表示一个异步操作的最终完成(或失败)及其结果值 好处: 逻辑更清晰了解axios函数内部运作机制成功和失败状态,可以关联对应处理程序能解决回调函数地狱问题 /*** 目标:使用Promise管理异步任…

基于JAVA的微信小程序二手车交易平台(源码)

博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

顺序表、单链表和双链表

2.算法设计题 1.合并递增链表 1.算法分析: 两个链表合并,由于限定不能用额外的存储空间,所以链表比较合适。 算法步骤: 第一步:取出b表中的第一个结点; 第二步:和a表中的结点依次比较&…

全国院校及梯度排序深度解析课(免费下载-帮助更多高考生做出人生重要的选择。)

"全国院校及梯度排序深度解析课"旨在深入探讨全国院校的排名及梯度排序原理。通过系统解析各院校的学术声誉、师资力量、科研水平等因素,帮助学员全面了解院校排名的背后逻辑,为选择合适院校提供理论支持。 课程大小:7G 课程下载…

Electron、QT、WPF三强争霸,该支持谁呢?

Electron、QT、WPF都是跨平台的桌面应用开发框架,都是非常流行的,作为开发者该选用哪个呢?本文从多个角度分析一下。 一、定义 Electron、Qt 和 WPF 都是用于创建桌面应用程序的框架或工具,它们各自有着不同的特点和优势。 Elec…

【3dmax笔记】036:FDD修改器

一、FDD修改器简介 FDD修改器是对模型进行变形处理的命令,FDD后面的数字越大,编辑节点越多,编辑越精细,但是FDD控制点多的同时,模型上的节点也要多才可以。 FFD修改器是一种非常灵活的修改器,可以让我们对模型进行自由的变形操作。通过在FFD修改器中设置变形点,我们可…

力扣HOT100 - 55. 跳跃游戏

解题思路&#xff1a; class Solution {public boolean canJump(int[] nums) {int n nums.length;int maxReach 0;// 正常来说每次至少跳一格&#xff0c;所以最多循环n次for (int i 0; i < n; i) {if (i > maxReach) return false;// 这种情况代表遇到了0&#xff0…

树莓派python开发

树莓派自带thonny 点亮LED灯 import RPi.GPIO as GPIO import time# 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM)# 设置LED引脚 led_pin 18# 设置LED引脚为输出 GPIO.setup(led_pin, GPIO.OUT)# 点亮LED GPIO.output(led_pin, GPIO.HIGH)# 延时2秒 time.sleep(2)# 关闭LED GPI…

机器学习周报第三十八周 iTransformer

文章目录 week38 iTransformer摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构**转置Embedding&#xff1a;****LayerNorm&#xff08;层归一化&#xff09;****Feed-forward network&#xff08;前馈网络&#xff09;****Multivariate-Attention&#xff08;多变量注意…

使用 PXE+Kickstart 批量网络自动装机

前言&#xff1a; 正常安装系统的话使用u盘一个一个安装会非常慢&#xff0c;所以批量安装的技术就出来了。 一、 概念 PXE &#xff08;Preboot eXecute Environment&#xff0c;预启动执行环境&#xff09;是由 Intel 公司开发的技术&#xff0c;可以让计算机通过网络来启动…

无人机+远程控制:卫星通信技术详解

无人机与远程控制技术的结合&#xff0c;为现代科技应用带来了广阔的前景。其中&#xff0c;卫星通信技术作为无人机远程控制的关键技术之一&#xff0c;发挥着至关重要的作用。以下是无人机远程控制中卫星通信技术的详细解析&#xff1a; 一、卫星通信技术的概述 卫星通信技术…

《完美黑暗》重启版6月发布,分析指出开发“没有问题” 状况没那么

易采游戏网5月12日消息&#xff0c;在21世纪初的游戏界&#xff0c;一款名为《完美黑暗》的FPS游戏在N64平台上崭露头角&#xff0c;以其独特的剧情设定和丰富的武器系统赢得了众多玩家的喜爱。然而&#xff0c;这款作品在推出时也并非一帆风顺&#xff0c;受到了不少玩家的吐槽…

C++高精度算法-加法

引子 在C++的运算中,难免会出现很大很大的数,下面是各个关键字的表示范围 但是如果要表示的数超过了long long可以表示的最大值( 2 64 2^{64} 264-1) 怎么办呢? 如果强制表示,就会溢出,这里的溢出大家可以自行百度,反正就是会出一些-5665434之类的数 现在,就要切入正…

后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解

JDBC 简化JDBC的开发 JDBC仅仅是一套接口 是一套规范 Mybatis是持久层框架 用于简化JDBC的开发 使用Java语言操作关系型数据库的一套API 原始的JDBC程序 package com.bigdate.mybatis;import com.bigdate.mybatis.mapper.UserMapper; import com.bigdate.mybatis.pojo.Use…

易图讯三维电子沙盘-大数据处理服务

易图讯科技10名高级大数据工程师&#xff0c;高效、快速进行POI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 免费专业提供POI、AOI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 1年更新2次POI、高清卫星影像。

[通用人工智能] 论文分享:ElasticViT:基于冲突感知超网的快速视觉Transformer

引言: 近年来&#xff0c;视觉Transformer&#xff08;Vision Transformer&#xff0c;简称ViT&#xff09;在计算机视觉任务中的应用日益广泛&#xff0c;从图像分类到对象识别等&#xff0c;均显示出优越的性能。然而&#xff0c;ViT模型也面临一些挑战&#xff0c;特别是在模…