mysql事务 事务并发问题 隔离级别 以及原理

mysql事务

简介:事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

事务四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

隔离性:

依赖于数据库的隔离级别
简单来说就是事务和事务之前不会互相影响

持久性:

事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
因为数据库中的数据是存储在磁盘当中的 会永久保存

并发事务引发的问题:

脏读:绝对的错误 读到了事务没有提交的数据

不可重复读:一个事务先后读取同一条记录,但是两次读取到的数据不同

幻读:一个事务在读取时没有这行数据 但是再插入数据时又发现这一行已经存在了 感觉像是出现了幻影(注意是幻影)

事务隔离级别:

在这里插入图片描述

  • Read Uncommitted(读未提交)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。三种并发事务问题都会出现。

  • Read Committed(读已提交)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
解决了脏读 但是会有不可重复度 和 幻读
这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

  • Repeatable Read(可重复读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  • Serializable(串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
可以理解成只能执行一个事务 不存在并发

查看事务隔离级别:

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

注意:事务隔离级别越高,数据越安全,但是性能越低。

隔离级别的实现原理

MySQL使用锁和MVCC来实现事务隔离。

锁是实现事务隔离的主要机制。MySQL中的锁可以分为全局锁和局部锁。全局锁影响整个数据库,而局部锁只影响单个表或行。常见的锁类型包括:

表级锁:最简单的锁类型,它锁定整个表,防止其他事务对表进行修改。MyISAM存储引擎使用表级锁。
行级锁:只锁定被访问的行,允许并发事务同时访问其他行。InnoDB存储引擎使用行级锁。
元数据锁(MDL):用于保护对表结构的修改,防止其他会话同时修改表结构。 多版本并发控制(MVCC)

多版本并发控制(MVCC)

MVCC提供了一种非阻塞的读操作方式,允许读操作看到一个数据的“快照”,而不是当前数据。InnoDB存储引擎使用MVCC来实现可重复读隔离级别。通过为每个事务提供一个数据快照,MVCC确保了事务在执行过程中看到的数据一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多模态交互式 AI 代理的兴起:探索 Google 的 Astra 和 OpenAI 的 ChatGPT-4o应用

OpenAI的发展 聊天GPT-4o 和 谷歌的阿斯特拉 标志着交互式人工智能代理的新阶段:多模式交互式人工智能代理的兴起。这次旅程开始于 Siri 和 Alexa的,它将语音激活的人工智能带入主流用途,并通过语音命令改变了我们与技术的交互。尽管有影响&a…

链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)

ConcurrentLinkedQueue是非阻塞线程安全(volatile不能完全保证线程安全)的队列,适用于“高并发”的场景。是一个基于链表节点的无界线程安全队列,按照 FIFO(先进先出,尾先进头先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。 volati…

linux笔记6--shell相关

文章目录 1. 查看当前的shell类型2. ps -f命令3. 父子shell4. 分号在命令里的作用问题:环境变量echo: 5. sleep和jobssleep:jobs:例子:&: 6. 外部命令和内建命令图解外部命令type命令 7. history命令8. alias命令9. 推荐 1. 查看当前的sh…

2024年推荐的适合电脑和手机操作的线上兼职副业平台

总是会有人在找寻着线上兼职副业,那么在如今的2024年,互联网提供了诸多方便,无论你是宝妈、大学生、程序员、外卖小哥还是打工族,如果你正在寻找副业机会,那么这篇文章将为你提供一些适合电脑和手机操作的线上兼职副业…

【mysql】更新操作是如何执行的

现有一张表,建表语句如下: mysql> create table T(ID int primary key, c int);如果要将 ID2 这一行的a字段值加 1,SQL语句会这么写: mysql> update T set c c 1 where ID 2;上面这条sql执行时,分析器会通过词…

普通人转行程序员,最大的困难是找不到就业方向

来百度APP畅享高清图片 大家好,这里是程序员晚枫,小破站也叫这个名。 我自己是法学院毕业后,通过2年的努力才转行程序员成功的。[吃瓜R] 我发现对于一个外行来说,找不到一个适合自己的方向,光靠努力在一个新的行业里…

CentOS 7.9部署宝塔面板超详细

CentOS7 部署宝塔面板 Linux的宝塔面板搭建起来非常轻松,也可以用一句话来形容,如果喝水一样简单,只需一条命令剩下的交给时间,几分钟就能部署好,然后就可以直接进行登录,直接可以安装LNMP、LAMP平台&…

Linux VIM指令

三种模式 命令模式:控制屏幕光标的移动,字符、字或行的删除等输入对文件的一些指令 插入模式:对文件内容进行文字输入 底行摸索:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作…

华为机考入门python3--(30)牛客30-字符串合并处理

分类:字符串、进制转换 知识点: 获取偶数下标的字符 even_chars my_str[::2] 获取奇数下标的字符 odd_chars my_str[1::2]) 翻转字符串 reversed_str my_str[::-1] 二进制转十进制 num int(reversed_binary, 2) 十进制转十六进制 …

Java锁的策略

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:<多线程案例(线程池)>&#x1f649; &#x1f439;今日诗词:"你我推心置腹, 岂能相负"&#x1f439; 目录 锁的策略 乐观锁和悲观锁 轻量级锁…

牛客网刷题 | BC99 正方形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

Linux(四)

Linux&#xff08;四&#xff09; shell脚本shell脚本开发过程创建创建.sh文件编写.sh文件添加执行的权限 chmod 777 1.sh运行 shell中注释shell中变量用户自定义变量 (尽量大写)位置参数即命令行参数预定义变量环境变量 shell中程序和语句说明性语句功能性语句echo 输出read 键…

【深度学习】2.单层感知机

目标&#xff1a; 实现一个简单的二分类模型的训练过程&#xff0c;通过模拟数据集进行训练和优化&#xff0c;训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集&#xff0c;包括特征矩阵data_x和对应的标签数据data_y。标签…

UniApp 2.0可视化开发工具:引领前端开发新纪元

一、引言 在移动互联网迅猛发展的今天&#xff0c;移动应用开发已经成为前端开发的重要方向之一。为了简化移动应用开发流程&#xff0c;提高开发效率&#xff0c;各大开发平台不断推出新的工具和框架。UniApp作为一款跨平台的移动应用开发框架&#xff0c;自诞生以来就备受开…

航运复兴?大摩不信!

大摩认为&#xff0c;从供需关系来看红海危机只是推迟了航运业下行周期的到来&#xff0c;一旦干扰消除&#xff0c;行业可能重回周期性低迷。 红海危机加剧运力紧张&#xff0c;航运市场价格飞涨。 大摩在24日的一份报告中指出&#xff0c;受红海危机干扰航运市场运力&#…

如何恢复未保存或丢失的Word文档?

许多用户会遇到Word文档未保存而关闭的问题。实际上&#xff0c;您不会立即丢失未保存的文档数据。请不要对文档进行进一步的更改&#xff0c;例如修改并再次保存。您仍然有机会恢复未保存的Word文档。有一些方法可以帮助您恢复未保存的 Word 文档。 如果您不幸遇到这样的问题…

基于单片机设计的多功能数字电压表开发

摘 要&#xff1a;在电路设计中我们时常会用到电压表&#xff0c;过去大部分电压表还是模拟的&#xff0c;虽然精度较高但模拟电压表采用用指针式&#xff0c;里面是磁电或电磁式结构&#xff0c;所以响应较慢。为适应许多高速信号领域目前已广泛使用数字电压表。数字电压表的诞…

各大排序算法

目录 插入排序 希尔排序(缩小增量排序) 冒泡排序 快速排序 选择排序 归并排序 插入排序 插入排序的基本思想是,将N个待排序元素分为一组有序表和一个无序表,一开始有序表只有一个元素,无序表中有N-1个元素,排序过程中每次取无序表的第一个元素依次与有序表的元素进行对比…

Leetcode260

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] singleNumber(int[] nums) {//通过异或操作,使得最终结果为两个只出现一次的元素的异或值int filterResult 0;for(int num:nums){filterResult^num;}//计算首个1(从右侧开始)…