MySQL基础:事务

news2024/11/20 7:18:11

 💎所属专栏:MySQL  

在这里插入图片描述

 

💎1. 事务

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

例如转账的过程:张三要给李四转1000元,此时需要先查询张三的账户余额,接着进行转出,然后转入李四的账户,但是此时如果程序出现异常,就会导致张三的钱没了,但是也没有加入到李四的账户上,这时就需要用到事务

默认MySQL的事务是自动提交的,也就是说,当执行一条SQL语句,MySQL就会立即隐式的提交事务

💎2. 事务操作

一个事务的操作流程包括了,开启事务,执行事务操作,提交事务或回滚事务,对于回滚事务来说,如果程序在执行过程中出现了错误,那么此时就需要执行回滚事务

💎2.1 查看/设置事务提交方式

 在刚开始提到过,MySQL的事务默认是自动提交的,此时把 @@autocommit 设置为0,就改为了手动的

select @@autocommit;

set @@autocommit = 0;

select * from account;
-- 查询张三的账户
select * from account where name = '张三';
-- 张三账户余额 -1000
update account set money = money - 1000 where name = '张三';
-- 李四账户余额 + 1000
update account set money = money + 1000 where name = '李四';

该为手动之后,有与没有设置事务提交,所以尽管执行了一些SQL语句,但是表中的数据并没有被改变

💎2.2 开启事务

start transaction ;

这个和设置  @@autocommit 为0 是一样的效果

💎2.3 提交事务

通过执行 commit 提交事务之后再刷新表格,之前的操作就生效了,并且一旦提交事务之后,就不能再进行回滚事务了

💎2.4 回滚事务

回滚事务是指在事务执行过程中遇到错误、冲突或用户取消操作等情况下,撤销已执行但尚未提交的事务中所做的所有修改,以恢复数据库到事务开始之前的状态,这样做就避免了数据因部分操作成功而部分失败导致的不一致状态。

💎3. 事务的四大特性

事务的四大特性也就是ACID,分别为:

1. 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败

2.一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态

3.隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

4.持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

💎4. 并发事务问题 

并发事务问题主要是指多个事务在同时操作一个数据库或是同一张表时可能出现的问题

问题描述
脏读一个事务读取到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这一行数据已经存在,好像出现了一个幻影

来解释一下不可重复读,例如事务A和事务B同时执行,在事务A执行查询操作之后事务B执行更新操作,然后事务B提交,这时数据库中的内容就被改变了,此时再执行事务A中的查询语句,由于查询的是相同的对象,所以就会出现两次读取的数据不同 

 再来看幻读的例子,还是两个事务同时执行,此时先执行事务A中的查询语句,查询到空的数据之后,再执行事务B中的插入语句,接着提交事务,然后再执行事务A中的插入数据,但是 id = 1已经在事务B中被插入过了,就会发生冲突,此时再查询 id = 1 就会发现这条数据已经存在了,这就是幻读

 

💎5. 事务隔离级别 

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(MySQL默认)××
Serializable×××

设置 session 和 global 的区别:

session(会话级):session参数仅在当前会话(或连接)中有效

global(全局级):global参数是全局的,意味着改变某个系统变量的值将会对所有会话都产生影响。 需要注意的是,一旦数据库服务重启,除非在配置文件(如my.cnf或my.ini)中进行了设置,否则这些全局变量的改变就会失效。

-- 查看事务的隔离级别
select @@transaction_isolation;

set session transaction isolation level read uncommitted ;

 接下来同时进行两个事务,修改事务 A 的隔离级别为 read uncommitted

此时,虽然 事务 B 并没有进行提交,但是事务 A 读取到了 事务 B 还没有提交的数据,就出现了脏读的问题

接下来看Read committed

首先修改事务 A 的隔离级别为 read committed ,然后开启事务 A ,查询当前表中的原始数据,然后开启事务 B ,执行事务 B 中的语句,再次在事务A中查询,发现数据并没有被影响,当事务B提交之后再在事务A中查询到了修改之后的数据

对于这种情况,在事务A中一直查询的是同一个表,但是由于事务B的提交而查询到不同的结果,也就是之前我们提到的不可重复读问题,针对这个问题,此时再把事务隔离级别修改为Repeatable Read,也就是MySQL默认的隔离级别

修改事务A的隔离级别为repeatable read并开启事务,先查询原始的数据,然后执行事务B的语句, 再次查询,这次事务A就不受事务B提交的影响

下面来演示一下幻读的问题:

在MySQL默认的隔离级别下,开启事务A,查找 id = 3的数据并没有找到,此时在事务B中插入这条数据,由于隔离级别的作用,虽然事务B已经提交,还是无法找到id = 3的数据,但是尝试在事务A中插入 id = 3的数据却出现了错误,这就是幻读

此时把隔离级别设置为 serializable 就能解决这个问题了

 

在这里插入图片描述

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

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

相关文章

【目标检测】模型评估指标

目标检测模型评价指标:准确度(accuracy)、精确率(precision)、召回率(recall)、交正比(IoU)、F1 Score等 1、目标检测模型评价指标 在 目标检测 任务中,常用的性能指标主要包括 检测精度指标 和…

Linux下opencv报错 undefined reference to cv::imread cv::Mat

如果你是和libtorch一起使用,那么请你继续,否则该篇文章不适合你。 正文 在https://pytorch.org/下 下载的时候要选择Cxx11 ABI版 随后正常配置就可以了

Leetcode JAVA刷刷站(79)单词搜索

一、题目概述 二、思路方向 为了解决这个问题,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历网格中的字符,并检查是否能形成给定的单词。这里,我提供一个基于DFS的解决方案。 在DFS中…

拆解简单的两种固定很简陋的无刷风扇,改造自己小风扇

两种风扇功能 一种是用于电脑主机降温的,另一种是挂脖风扇的一个,拆开之后才知道固定底座很简陋 拆解降温风扇 最后分离定子和支架 个人还是不喜欢暴力拆解的,但尝试后发现,这个不暴力拆不掉,固定的塑料和上面定子…

python实现链表

什么是链表 链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。通过节点之间的相互连接最终串联成一个链表。 python实现一个简单链表 我们可以用python实现一个超级简单的链表 class node:# 初始化数据def __init_…

Golang | Leetcode Golang题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; func isPerfectSquare(num int) bool {x0 : float64(num)for {x1 : (x0 float64(num)/x0) / 2if x0-x1 < 1e-6 {x : int(x0)return x*x num}x0 x1} }

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

Dumpy:一款针对LSASS数据的动态内存取证工具

关于Dumpy Dumpy是一款针对LSASS数据的动态内存取证工具&#xff0c;该工具专为红队和蓝队研究人员设计&#xff0c;支持重新使用打开的句柄来动态转储 LSASS。 运行机制 Dumpy可以动态调用 MiniDumpWriteDump 来转储 lsass 内存内容。此过程无需打开 lsass 的新进程句柄&…

海山数据库(He3DB)+AI:(一)神经网络基础

文章目录 1 引言2 基本结构2.1 神经元2.2 模型结构 3 训练过程3.1 损失函数3.2 反向传播3.3 基于梯度的优化算法 4 总结 1 引言 神经网络可以被视为一个万能的拟合器&#xff0c;通过深层的隐藏层实现输入数据到输出结果的映射。神经网络的思想源于对大脑的模拟&#xff0c;在…

【源码+文档+调试讲解】病房管理系统设计与实现

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

springboot集成海康sdk,针对视频流获取某一点的实时温度

直接上代码吧: 前端页面专递点的x和y的坐标及其设备的ip @RequestMapping(value = "/getRealTemperatureByPoint") public float getRealTemperatureByPoint(HttpServletRequest request) {Map<String, Object> params = ParamUtil.getParams(request);Strin…

vue elementPlus中使用dayjs

安装了elementPlus后无需再次下载dayjs,因为element 中包含了dayjs 官网截图 引入方法&#xff1a; import { dayjs } from element-plus// 引入中文包 import dayjs/locale/zh-cn dayjs.locale(zh-cn) // 设置中文 使用方法和dayjs 官网一致 const state reactive({week…

Linux 安装TELEPORT堡垒机

一、查看官方文档 堡垒机官网地址&#xff1a;走向成功 - Teleport&#xff0c;高效易用的堡垒机 &#xff08;一&#xff09;官网资源链接 -》Teleport 在线文档 &#xff08;二&#xff09;手动下载安装包 二、压缩包下载和安装 &#xff08;一&#xff09;加压下载的安装…

实现高效研发运营一体化:深度落地DevOps解决方案的探索与实践

前言与概述 伴随着企业业务的快速发展&#xff0c;为了支撑业务发展&#xff0c;提高 IT 对业务的支撑能力建设。在研发工程协同方面&#xff0c;希望加强代码管理&#xff0c;实现持续构建、自动化测试、自动化部署、自动化运维&#xff0c;同时加强产品的安全和质量管理&…

VBA调用Office的MODI组件识别图片中的文字

Microsoft Office Document Imaging (MODI)是Office 2003-2007版本中的一个利用OCR&#xff08;Optical Character Recognition 光学字符识别&#xff09;技术识别图像中的文字并转换为文本的一个组件。在VBA中使用该组件需要在“工具-引用”中将其设置为“可使用的引用”&…

基于Kotlin Multiplatform的鸿蒙跨平台开发实践

一、 背景 在 2023 年的华为开发者大会&#xff08;HDC&#xff09;上&#xff0c;华为预告了一个全新的鸿蒙系统 Harmony Next 版本。与之前的鸿蒙系统不同&#xff0c;Harmony Next完全摒弃了对 AOSP 的兼容&#xff0c;彻底基于 OpenHarmony 开源鸿蒙实现。这意味着该系统将…

集团数字化转型方案(七)

集团数字化转型方案旨在通过全面整合先进的信息技术和数据分析工具&#xff0c;构建一个高度智能化的业务平台&#xff0c;实现从生产、供应链到客户服务的全链条数字化升级&#xff0c;通过自动化流程优化、数据驱动的决策支持和智能化的业务运营&#xff0c;提升整体运营效率…

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

C语言 | Leetcode C语言题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; bool canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {int j1 jug1Capacity < jug2Capacity ? jug1Capacity : jug2Capacity, j2 jug1Capacity > jug2Capacity ? jug1Capacity : jug2Capacity;if (ta…

C++ 设计模式——单例模式

单例模式 C 设计模式——单例模式1. 单例模式的基本概念与实现2. 多线程环境中的问题3. 内存管理问题1. 内存泄漏风险2. 自动释放策略3. 垃圾回收机制4. 嵌套类与内存管理 4. UML 图UML 图解析 优缺点适用场景总结 C 设计模式——单例模式 单例模式&#xff08;Singleton Patt…