MySQL事务相关知识

news2024/9/27 17:32:07

 实践阅读:一文彻底读懂MySQL事务的四大隔离级别

1、什么是事务?

        数据库事务(简称:事务),是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。 

2、MySQL事务的四大特性以及实现原理?

事务特性ACID原子性Atomicity)、一致性Consistency)、隔离性Isolation)、持久性Durability)。 

  • 原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行,是一个不可分割的整体。
  • 一致性(Consistency): 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
  • 隔离性(Isolation): 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。
  • 持久性(Durabilily): 表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

事务ACID特性的实现思想:

原子性:是使用 undo log来实现的,如果事务执行过程中出错或者用户执行了rollback,系统通过undo log日志返回事务开始的状态。

持久性:使用 redo log来实现,只要redo log日志持久化了,当系统崩溃,即可通过redo log把数据恢复。

隔离性:通过锁以及MVCC,使事务相互隔离开。

一致性:通过回滚、恢复,以及并发情况下的隔离性,从而实现一致性。

3、事务并发会存在哪三种问题?

事务并发会引起数据的脏读、不可重复、幻读等问题。 

脏读(dirty read) 是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

  • 假设现在A的余额是100,事务A正在准备查询Jay的余额
  • 这时候,事务B先扣减Jay的余额,扣了10
  • 最后A 读到的是扣减后的余额
  • 事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读


不可重复读(unrepeatable read) 是指在对于数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另一个事务修改了数据并提交了。

  • 事务A先查询Jay的余额,查到结果是100
  • 这时候事务B 对Jay的账户余额进行扣减,扣去10后,提交事务
  • 事务A再去查询Jay的账户余额发现变成了90
  • 事务A又被事务B干扰到了!在事务A范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读


幻读  是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,就像产生幻觉一样,这就是发生了幻读。

  • 事务A先查询id大于2的账户记录,得到记录id=2和id=3的两条记录
  • 这时候,事务B开启,插入一条id=4的记录,并且提交了
  • 事务A再去执行相同的查询,却得到了id=2,3,4的3条记录了。
  • 事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读

不可重复读侧重于修改,幻读侧重于新增或删除(多了或少量行),脏读是一个事务回滚影响另外一个事务。 

4、事务的四大隔离级别是什么?

        事务隔离就是为了解决上面提到的脏读、不可重复、幻读等问题,MySQL实现了四种类型的隔离级别:

  • 读未提交(Read Uncommitted)在本隔离级别,所有事务都可以看到其他未提交事务的执行结果。 本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
  • 读已提交(Read Committed)一个事务只能看见已经提交事务所做的改变。可避免脏读的发生
  • 可重复读(Repeatable Read)MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
  • 串行化(Serializable)通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

5、如何查看和设置事务的隔离级别?

-- 查看当前事务的隔离级别
SELECT @@transaction_isolation;
-- 或者简写
select @@tx_isolation

-- 查询可得到当前默认的事务隔离级别为 REPEATABLE-READ(可重复读)
mysql> SELECT @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

-- 设置隔离级别
set session transaction isolation level read uncommitted;  -- 设置为读未提交
set session transaction isolation level read committed;  -- 设置为读已提交
set session transaction isolation level repeatable read;  -- 设置为可重复读(默认的)
set session transaction isolation level serializable;   --设置为串行化

6、如何设置事务的手动commit提交

-- 查看当前事务的提交状态
mysql> show variables like '%commit%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| autocommit                              | ON    |   -- 默认是开启状态
| binlog_group_commit_sync_delay          | 0     |
| binlog_group_commit_sync_no_delay_count | 0     |
| binlog_order_commits                    | ON    |
| innodb_api_bk_commit_interval           | 5     |
| innodb_commit_concurrency               | 0     |
| innodb_flush_log_at_trx_commit          | 1     |
| replication_sender_observe_commit_only  | OFF   |
| slave_preserve_commit_order             | OFF   |
+-----------------------------------------+-------+

-- 关闭事务自动提交
SET autocommit = 0;   -- 0 关闭 1 开启
或者:
SET autocommit = off   -- off 或 on

-- 默认情况下 autocommit = 1,是自动提交事务的。
-- autommit 是 session 级别的,就是当前连接更改了autocommit对其他连接没有影响。
-- 设置 autocommit 之后,本次连接的所有 sql 都是事务的形式,比如每次 commit 提交。

 7、开启事务、提交事务、事务回滚的命令是什么?

-- 演示的时候首先设置 SET autocommit = 0; 把提交事务设置为手动提交
-- 开启事务
mysql> begin;
或者:
mysql> start transaction;

-- 提交事务
mysql> commit;

-- 事务回滚
mysql> rollback;

8、MySql隔离级别的实现原理

实现隔离机制的方法主要有两种:

  • 读写锁
  • 一致性快照读,即 MVCC

MySql使用不同的锁策略(Locking Strategy)/MVCC来实现四种不同的隔离级别。RR、RC的实现原理跟MVCC有关,RU和Serializable跟锁有关。

 

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

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

相关文章

AcWing 4645. 选数异或(预处理小区间 + 二分优化找)

题目如下: 题解 or 思路 在 [l,r][l, r][l,r] 区间内找到两个数 a,ba, ba,b 使得 a ^ b x 通过异或的性质: a ^ b ^ b x ^ b > a x ^ b 我们可以通过 b 可以迅速找到 a, a x ^ b 我们可以现预处理出所有小区间(大区间可以不需要,因为…

win11怎么分回c盘空间

有网友反映自己的win11系统有多个分区,c盘分区的空间比较小,便想通过win11分盘功能,将临近的磁盘空间分给c盘。那么win11怎么分回c盘空间?下面就教下大家win11将其他盘空间分回c盘的方法步骤。 工具/原料: 系统版本&am…

最近几年-基于深度学习自然语言处理的推荐系统-必读论文整理分享

基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用…

02-JVM堆里面的分区:Eden,survival (from+ to),老年代,各自的特点?

1.模型 堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含 EdenSurvivor 区,survivor 区里面分为 from 和 to 区. 内存回收时,如果用的是复制算法,从 from 复制到 to…

项目实战之旅游网(十三)前台产品详情 前台收藏

目录 一.前台产品详情 1.查询产品 2.收藏按钮 二.前台收藏 本章的代码会统一放到最后。 一.前台产品详情 1.查询产品 即点击“查看详情”即可得到这个产品的详细描述。 并且项目运行起来之后,可以在后台新建新的产品,在前台可以实时查询到。 2.…

C工程与寄存器封装

目录 一、C语言工程简介 二、启动代码分析 三、C语言实现LED 四、寄存器的封装方式 五、寄存器操作的标准化 六、流水灯 一、C语言工程简介 先将工程模板解压 include里是.h文件 src里是.c文件 start里面是.s启动文件 ## NAME interface CROSS_COMPILE arm-no…

Fusion360 外壳开孔零件居中对齐的方法

DIY时需要根据从市场上采购的成品盒子进行开孔,通过3维软件进行开孔设计是比较方便的。Solidworks由于版权问题不易采用,Fusion360的个人版由于软件差异不像Solidworks方便约束定位。我通过尝试找到了适用方法。 先看成果。在一块板上居中位置开孔以便安…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题(共25题,每题2分,共50分) 二、判断题(共10题,每题2分,共20分) 三、编程题【该题由测评师线下评分】(共3题,共30分) 青少年软件…

阶段性回顾(4)与四道题目

TIPS 1. 当创建数组的时候,如果没有指定数组的元素个数也没关系,编译器会根据你初始化的内容来自行确定。 2. 在逻辑表达式当中,如果为真,就以1作为结果,如果为假,就以0作为结果。 3. 输入字符串的时候&…

VUE实例的组件的生命周期和数据共享和ref的使用方法(建议直接看ref)

目录VUE实例的组件的生命周期和数据共享组件间的数据共享ref的使用方法使用ref操作dom使用ref引用组件this.$nextTick(cb)方法的使用VUE实例的组件的生命周期和数据共享 生命周期和生命周期函数 这个是我学校vue书籍阿里云盘地址,有需要可以点击看看 生命周期(Life…

对Java中异常的认识

文章目录一、异常的概念与体系结构1.异常的概念2.异常的体系结构3.异常的分类二、异常的处理1.防御式编程2. 异常的抛出3.异常的捕获4.异常处理流程总结三、自定义异常类一、异常的概念与体系结构 1.异常的概念 在生活中,当我们发现朋友表现出不舒服的情况&#x…

LabVIEW ​​单​进程​共享​变量​与​​全局​变量

LabVIEW ​​单​进程​共享​变量​与​​全局​变量 单​进程​共享​变量​与​LabVIEW​全局​变量​相似。​事实​上,​单​进程​共享​变量​的​实现​是在​LabVIEW​全局​变量​的​基础​上​增加​了​时间​标识​功能。 ​为了​比较​单​进程​…

《终身成长》读书笔记

文章目录书籍信息思维模式思维模式解析关于能力和成就的真相体育:冠军的思维模式商业:思维模式和领导力人际关系:关于相处的思维模式父母、老师与教练:思维模式的传播改变思维模式书籍信息 书名:《终身成长》 作者&am…

Java算法_LeetCode26:删除排序数组中的重复项

LeetCode26:删除排序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度&a…

设计模式-责任链模式之**动态配置责任链**

正在参加2022年度博客之星评选,大家帮我点个五星好评。有投必会 责任链的优势劣势我就不说,百度上很多。 1、怎么:动态配置责任链 通过配置文件yml来指定你的责任链的执行顺序。 地址 配置文件如何配置,怎么读取 为什么&#x…

HTTP协议详解 - 通过C++实现HTTP服务剖析HTTP协议

前言 C/C程序员一般很少会接触到HTTP服务端的东西,所以对HTTP的理解一般停留在理论。 本文章实现通过C实现了一个http服务,可以通过代码对HTTP协议有更深的理解,并且通过抓包工具对HTTP协议进行更为详细的分析。 HTTP协议简介 HTTP(hypert…

Linux--多线程

目录1. 什么是线程2. 创建线程3. 线程等待3.1 pthread_join函数3.2 线程分离3.2 线程终止的方案4. 线程ID1. 什么是线程 Linux中没有专门为线程设计TCB,而是用进程的PCB来模拟进程。 这也是为什么有种观点会说Linux下没有真正意义上的线程。 对于线程来说&#xf…

Elasticsearch搜索引擎(二)——SpringData Elasticsearch

SpringData Elasticsearch SpringData介绍 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在…

CSND近期推出的猿如意到底怎么样?

CSND近期推出的猿如意到底怎么样? 投稿测评正文 猿如意传送门 猿如意下载地址:猿如意-程序员的如意兵器,工具代码,一搜就有 猿如意使用了几次了,今天来想分享一下我对于猿如意的使用感受吧!! 先说结论&#xff1a…

吴恩达《机器学习》——Logistics回归代码实现

Logisitc回归1. Sigmoid与二分类Sigmoid函数为什么Sigmoid函数可以表示二分类概率?2. Logistics回归交叉熵损失函数梯度过拟合与欠拟合正则化3. Python代码实现4. 单维与多维Logistic分类单维数据分类多维数据分类数据集、源文件可以在Github项目中获得 链接: https…