【MySQL】事务

目录

  • 基本概念
  • 事务操作
    • 自动提交事务
    • 开启事务
    • 提交事务
    • 回滚事务
    • 代码示例
  • 事务的特性 ACID
  • 事务的隔离级别
    • 读未提交 read uncommitted
    • 读已提交 read committed
    • 可重复读 repeatable read
    • 序列化(串行) serializable
    • 操作示例

基本概念

在 MySQL 中的事务(Transaction)是由存储引擎实现的,在 MySQL 中,只有 InnoDB 存储引擎才支持事务

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行

事务用来管理 DDL、DML、DCL 操作,比如 insert,update,delete 语句,默认是自动提交的

事务操作

自动提交事务

之前的所有 SQL 操作也有事务,只是 MySQL 自动完成了,没执行一条 SQL 语句,MySQL 就自动提交事务,因此如果想要手动控制事务,就必须关闭 MySQL 的自动提交事务

语法:

set autocommit=0; -- 关闭自动提交
set autocommit=1; -- 开启自动提交

开启事务

任何一条 DML 语句(insert、update、delete)执行,标志事务的开启

语法:beginstart transaction

提交事务

成功的结束,将所有的 DML 语句操作历史记录和底层硬盘数据来一次同步

语法:commit

回滚事务

失败的结束,将所有的 DML 语句操作历史记录全部清空

语法:rollback

代码示例

create table account(id int primary key ,name varchar(20) ,money double
);
insert into account values (1,'张三',1000),(2,'李四',1000);-- 关闭自动提交
set autocommit = 0;
-- 模拟账户转账
-- 开启事务
begin;
update account set money=money-200 where name = '张三';
update account set money=money+200 where name = '李四';
-- 提交事务
commit ;

结果如下:

在这里插入图片描述

而如果只开启没提交的话,数据不会彻底落盘,虽然查询的数据变了,但是原表中的数据还没发生改变

begin;
update account set money=money-200 where name = '张三';
update account set money=money+200 where name = '李四';
select * from account;

在这里插入图片描述

这个时候回滚事务再查询数据,就会发现之前修改的操作被删除了,查询出来的数据跟原表中的数据一致

-- 回滚事务
rollback ;
select * from account;

在这里插入图片描述

事务的特性 ACID

原子性(Atomicity)
事务是不可分割的最小操作单元,要么全部执行,要么全部不执行。例如银行转账,扣钱与加钱操作必须同时成功或失败,不能只执行一半。

一致性(Consistency)
事务执行前后,数据库从一个合法状态转换到另一个合法状态。如转账前后,双方账户总金额不变。

隔离性(Isolation)
多个并发事务之间相互隔离,避免彼此干扰。根据隔离级别(如读未提交、读已提交、可重复读、串行化),控制事务间的可见性和冲突。

持久性(Durability)
事务提交后,对数据的修改会永久保存到存储介质(如磁盘),即使数据库崩溃也不丢失。

事务的隔离级别

读未提交 read uncommitted

一个事务可以读取另一个未提交事务的数据,是最低隔离级别,任何情况都无法保证,会造成脏读

脏读是数据库事务中的异常现象,指一个事务读取了另一个未提交事务修改的数据

场景示例:

  1. 事务 A 操作:执行 UPDATE account SET balance = 900 WHERE id = 1;(将账户余额改为 900 元),但未提交事务
  2. 事务 B 读取:此时事务 B 执行 SELECT balance FROM account WHERE id = 1;,读取到事务 A 未提交的 “900 元”
  3. 事务 A 回滚:若事务 A 最终回滚,数据恢复原状(如余额仍是 1000 元),则事务 B 读取的 “900 元” 从未真正生效,属于无效的 “脏数据”

影响:脏读破坏了数据一致性,事务 B 基于未最终确定的数据执行后续操作,可能导致业务逻辑错误(如错误计算余额、触发错误流程)。通过提升事务隔离级别(如使用 “读已提交”),可避免脏读问题,确保事务仅读取已提交的数据

读已提交 read committed

一个事务需等另一个事务提交后才能读取数据,可避免脏读,但会造成不可重复读

不可重复读是数据库事务中的异常现象,指同一事务内多次读取相同数据,结果却不一致,根源是其他事务在期间提交了数据修改

场景示例:

  1. 事务 A 首次查询:事务 A 执行 SELECT price FROM product WHERE id = 1;,读取商品价格为 100 元
  2. 事务 B 修改提交:事务 B 执行 UPDATE product SET price = 120 WHERE id = 1; 并提交,价格更新为 120 元
  3. 事务 A 再次查询:事务 A 再次执行相同查询,此时读到价格变为 120 元,两次结果不同

影响:该现象破坏事务一致性。如事务 A 基于首次读取的价格计算库存价值,后续因价格变动导致计算错误,影响业务逻辑正确性。通过将事务隔离级别设为 “可重复读”,可避免此问题,确保事务内读取数据始终一致

可重复读 repeatable read

在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读,但会造成幻读

幻读是数据库事务中的一种现象,指在一个事务内,相同的查询条件多次执行查询时,由于其他事务在该期间进行了插入、删除或修改符合查询条件的数据的操作 ,导致多次查询的结果集出现差异,就好像产生了幻觉一样

场景示例:

  1. 事务 A 首次查询:银行系统中,事务 A 要批量处理余额大于 10 万元的账户,执行 SELECT account_id FROM accounts WHERE balance > 100000;,查询到 10 个符合条件的账户(如 ID 为 1-10)
  2. 事务 B 插入新账户:此时,事务 B 向系统中插入一个新账户(ID=11,余额 15 万元),并执行 INSERT INTO accounts (account_id, balance) VALUES (11, 150000); 后提交
  3. 事务 A 再次查询:事务 A 继续处理时,再次执行相同查询,结果变为 11 个账户(新增了 ID=11)

影响:幻读导致同一事务内多次相同查询的结果集不一致,使事务失去对数据的统一认知。例如,在银行账户批量处理场景中,事务 A 原本计划处理 10 个高余额账户,但因幻读多出 1 个新账户,导致实际处理范围与预期不符,破坏了事务执行的一致性。基于幻读结果的业务操作可能出现偏差。例如,电商库存管理中,事务 A 统计库存大于 50 件的商品后,因幻读导致部分商品被误判为有库存,最终引发超卖或库存统计错误,直接影响订单处理和销售策略。为避免幻读,开发人员需手动引入锁机制(如 SELECT … FOR UPDATE)或编写复杂查询逻辑,这会增加代码复杂度和维护成本。例如,在统计类任务中,可能需要额外的条件或锁来确保结果集稳定

Mysql 的默认隔离级别是 repeatable read

序列化(串行) serializable

最高事务隔离级别,事务串行化顺序执行,可避免脏读、不可重复读与幻读。但该级别效率低下,耗数据库性能,一般不使用

事务隔离级别脏读不可重复读幻读
读未提交 read uncommitted
读已提交 read committed×
可重复读 repeatable read××
序列化(串行) serializable×××

操作示例

-- 查看隔离级别  
show variables like '%isolation%';  -- 设置隔离级别  
/*  
set session transaction isolation level 级别字符串  
级别字符串:read uncommitted、read committed、repeatable read、serializable  
*/  
-- 设置read uncommitted  
set session transaction isolation level read uncommitted;  -- 设置read committed  
set session transaction isolation level read committed;  -- 设置repeatable read  
set session transaction isolation level repeatable read;  -- 设置serializable  
set session transaction isolation level serializable;

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

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

相关文章

flutter doctor提示cmdline-tools component is missing错误的解决

flutter doctor检测环境后报错如下: STEP1: 配置command-lines 📌 打开Androidstudio ,找到sdkmanager 👇 安装command-line tools 如果找不到,记得打开右下角的「Show Package Details} 再次运行flutter doctor 即可正常 如…

iptables和netfilter内部报文处理

一、Iptables和netfilter 1.iptables基础 netfilter强大功能以及灵活性是通过iptables界面来实现。此命令行工具和它的前身ipchains语法相似;不过iptables使用netfilter子系统来增进网络连接、检验和处理方面的能力;ipchains使用错综复杂的规则集合来过…

[项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取

基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050 一.芯片介绍二.配置I2C三.编写驱动四.读取任务的测试 一.芯片介绍 芯片应该放置在PCB中间,X Y轴原点,敏感度131表示范围越小越灵敏。理想状态放置在地面上X,Y,Z轴为0,即…

JVM垃圾回收笔记01

文章目录 前言1. 如何判断对象可以回收1.1 引用计数法1.2 可达性分析算法查看根对象哪些对象可以作为 GC Root ?对象可以被回收,就代表一定会被回收吗? 1.3 引用类型1.强引用(StrongReference)2.软引用(SoftReference…

解决Popwindow宽高的问题。

问题 在使用Popwindow进行自定义的过程中&#xff0c;需要设置popwindow的宽高。但是宽高很多时候容易出问题。比如下面的例子。 布局文件如下 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

Bell-1量子计算机分析:开启量子计算2.0时代的创新引擎

Bell-1量子计算机:开启量子计算2.0时代的创新引擎 一、引言 1.1 研究背景 在当今科技飞速发展的时代,量子计算作为前沿领域,正深刻地改变着科技格局,引领新一轮科技革命与产业变革。自 20 世纪 80 年代量子计算概念被提出以来,历经多年的理论探索与技术攻坚,已取得了众…

什么?中断禁用失效了?

什么&#xff1f;中断禁用失效了&#xff1f; 1. 前言 道友们&#xff0c;在嵌入式的开发中我们不管是RTOS或NO-RTOS的开发&#xff0c;都无法避免“多线程”的应用场景&#xff0c;高优先级的任务或中断打断低优先级的任务或中断&#xff0c;此时为了要保证共享数据的安全性…

单表达式倒计时工具:datetime的极度优雅(Kimi)

一个简单表达式&#xff0c;也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建&#xff0c;本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…

[笔记.AI]多头自注意力机制(Multi-Head Attention)

多头自注意力是深度学习领域&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;和Transformer模型中的关键概念。其发展源于对序列数据中复杂依赖关系的建模需求&#xff0c;特别是在Transformer架构的背景下。 举例 比喻-读长篇文章 用一个简单的比喻来理解“多头注…

SOFABoot-02-模块化隔离方案

sofaboot 前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金…

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录 引言系统要求1. 环境准备&#xff1a;安装Miniconda激活环境 2. 配置pip源加速下载3. 配置学术加速&#xff08;访问国外资源&#xff09;4. 安装系统依赖5. 安装OLMOCR6. 运行OLMOCR处理PDF文档7. 理解OLMOCR输出结果9. 可视化UI界面9.1 安装界面依赖9.2 创建界面应用…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

边缘计算革命:重构软件架构的范式与未来

摘要 边缘计算通过将算力下沉至网络边缘&#xff0c;正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新&#xff0c;包括分布式分层架构、实时资源调度、安全防护体系等技术变革&#xff0c;并结合工业物联网、智慧医疗等场景案例&#xff0c…

单链表:数据结构的灵动之链

本文主要讲解链表的概念和结构以及实现单链表 目录 一、链表的概念及结构 二、单链表的实现 1.1链表的实现&#xff1a; 1.2单链表的实现&#xff1a; 单链表尾插&#xff1a; 单链表的头插&#xff1a; 单链表的尾删&#xff1a; 单链表头删&#xff1a; 单链表查找&#…

链表题型-链表操作-JS

一定要注意链表现在的头节点是空节点还是有值的节点。 一、移除链表中的元素 有两种方式&#xff0c;直接使用原来的链表进行删除操作&#xff1b;设置一个虚拟头节点进行删除操作。 直接使用原来的链表进行删除操作时&#xff0c;需要考虑是不是头节点&#xff0c;因为移除…

读《浪潮之巅》:探寻科技产业的兴衰密码

引言&#xff1a;邂逅《浪潮之巅》 在信息技术飞速发展的今天&#xff0c;科技公司如繁星般闪烁&#xff0c;又似流星般划过。而我与《浪潮之巅》的相遇&#xff0c;就像在浩渺的科技海洋中&#xff0c;发现了一座指引方向的灯塔。初次听闻这本书&#xff0c;是在一次技术交流会…

【和春笋一起学C++】文本文件I/O

在windows系统中读取键盘的输入和在屏幕上显示输出统称为&#xff1a;控制台输入/输出。把读取文本文件和把字符输出到文本文件中统称为&#xff1a;文本文件I/O。 目录 1. 输出文本文件 2. 读取文本文件 1. 输出文本文件 把字符输出到文本文件中和输出到控制台很相似&#x…

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…

Live555+Windows+MSys2 编译Androidso库和运行使用

下载 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

大模型-提示词工程与架构

什么是提示工程 提示工程&#xff08;Prompt Engineering&#xff09;是一门新兴的技术领域&#xff0c;专注于研究如何设计、构建和优化提示词&#xff0c;以充分发挥大模型的潜力 。它涉及到对语言结构、任务需求、模型特性等多方面因素的综合考量。提示工程的目标是通过精心…