MySQL 事务(Transaction)详解

MySQL 事务(Transaction)详解


1. 什么是事务?

事务(Transaction)是一组要么全部执行,要么全部回滚的 SQL 语句,用于保证数据一致性。事务一般用于银行转账、订单支付等操作,确保多个步骤要么全部成功,要么全部失败。

事务的特点(ACID):

  1. 原子性(Atomicity):事务是一个不可分割的最小操作单位,要么全部执行,要么全部回滚。
  2. 一致性(Consistency):事务执行后,数据库必须保持一致状态。
  3. 隔离性(Isolation):多个事务并发执行时,相互之间不会影响。
  4. 持久性(Durability):事务提交后,对数据库的更改是永久性的。

2. 事务的基本操作

在 MySQL 中,事务通常用 START TRANSACTIONBEGIN 开始,COMMIT 提交,ROLLBACK 回滚:

-- 开启事务
START TRANSACTION;-- 执行 SQL 语句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 提交事务(数据永久生效)
COMMIT;

如果中途发生错误,可以回滚:

-- 开启事务
START TRANSACTION;-- 执行 SQL 语句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- 发生错误,回滚事务
ROLLBACK;

3. 事务的隔离级别

MySQL 事务的隔离级别影响并发事务的执行方式,常见隔离级别:

隔离级别脏读不可重复读幻读默认值
READ UNCOMMITTED(读未提交)❌ 可能❌ 可能❌ 可能
READ COMMITTED(读已提交)✅ 避免❌ 可能❌ 可能
REPEATABLE READ(可重复读)✅ 避免✅ 避免❌ 可能✅(MySQL 默认)
SERIALIZABLE(串行化)✅ 避免✅ 避免✅ 避免

如何设置隔离级别?

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4. 事务的常见问题

(1)脏读(Dirty Read)

发生在 READ UNCOMMITTED 级别:一个事务能读取另一个未提交事务的数据,如果对方回滚,读取的数据就是无效的。

-- 事务 A
START TRANSACTION;
UPDATE accounts SET balance = 500 WHERE user_id = 1;
-- 此时事务 A 还未提交-- 事务 B
SELECT balance FROM accounts WHERE user_id = 1; -- 读取到了未提交的值

解决方案:使用 READ COMMITTED 以上隔离级别。


(2)不可重复读(Non-Repeatable Read)

发生在 READ COMMITTED 级别:同一个事务多次读取数据,发现数据不一致(另一事务修改了数据并提交)。

-- 事务 A
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1; -- 读取值 500-- 事务 B(修改后提交)
UPDATE accounts SET balance = 600 WHERE user_id = 1;
COMMIT;-- 事务 A(再次读取)
SELECT balance FROM accounts WHERE user_id = 1; -- 发现变成 600

解决方案:使用 REPEATABLE READ 以上隔离级别。


(3)幻读(Phantom Read)

发生在 REPEATABLE READ 级别:事务中多次查询,发现新增的行。

-- 事务 A
START TRANSACTION;
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- 10 条数据-- 事务 B(插入新数据并提交)
INSERT INTO orders(user_id, amount) VALUES (1, 100);
COMMIT;-- 事务 A(再次查询)
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- 发现 11 条数据

解决方案:使用 SERIALIZABLE 级别,防止新数据插入。


5. InnoDB 与 MyISAM 事务支持

存储引擎事务支持适用场景
InnoDB✅ 支持事务适合高并发、数据一致性要求高的系统,如金融、订单
MyISAM❌ 不支持事务适合读取操作多的场景,如 CMS 系统

如何查看表的存储引擎?

SHOW TABLE STATUS WHERE Name = 'my_table';

6. MySQL 事务最佳实践

  1. 尽量使用 InnoDB,保证事务支持。
  2. 缩小事务范围,避免长时间锁表影响性能。
  3. 避免事务嵌套,减少锁竞争。
  4. 使用索引优化查询,减少锁的范围,提高并发效率。
  5. 发生错误时记得 ROLLBACK,确保数据一致性。
  6. 适当选择隔离级别,根据业务需求权衡并发性和数据一致性。

7. 事务相关的 SQL 语句

操作SQL 语句
开启事务START TRANSACTION;BEGIN;
提交事务COMMIT;
回滚事务ROLLBACK;
设置隔离级别SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
查看当前事务隔离级别SELECT @@TRANSACTION_ISOLATION;

8. 总结

  • 事务保证 ACID,保证数据库的一致性。
  • MySQL 事务隔离级别决定数据并发访问时的行为,REPEATABLE READ 是 MySQL 默认隔离级别。
  • 事务的三大问题:脏读、不可重复读、幻读,可通过不同的隔离级别解决。
  • InnoDB 支持事务,MyISAM 不支持
  • 务必在事务结束后 COMMITROLLBACK,防止事务长时间占用资源。

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

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

相关文章

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载,对比传统SPI机制: 传统SPI扫描路径:META-INF/services/** Spring Boot新方案:META-INF/spring/org.springfram…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的异常处理:全局异常与自定义异常

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

思源配置阿里云 OSS 踩坑记

按照正常的配置IAM&#xff0c;赋予OSS权限&#xff0c;思源笔记还是无法使用&#xff0c;缺少ListBuckets权限。 正常配置权限&#xff0c;又无法覆盖&#xff0c;因此需要手动配置权限。 {"Version": "1","Statement": [{"Effect":…

Debezium日常分享系列之:Debezium Charts

Debezium日常分享系列之&#xff1a;Debezium Charts 最近&#xff0c;围绕 Debezium 图表发生了一些变化&#xff0c;所以我在这里解释这些变化是什么以及背后的理由。正如您从我们的最新公告中了解到的&#xff0c;我们将发布 Debezium 管理平台的第一个版本。 Debezium 管理…

moveit2基础教程上手-使用xarm6演示

0、前置信息 开发环境&#xff1a;wsl。 ros版本&#xff1a;jazzy&#xff0c;ubuntu版本&#xff1a;24.04 xarm-ros2地址 1、启动Rviz&#xff0c;加载 Motion Planning Plugin&#xff0c;实现演示功能 Getting Started — MoveIt Documentation: Rolling documentation…

第十六届蓝桥杯模拟二

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

在OpenGL ES中将值传入shader的方法总结

在OpenGL ES中&#xff0c;将值传入Shader的方式主要有以下几种&#xff1a; 1. Uniform变量 用途&#xff1a;用于传递在绘制过程中不变的常量数据&#xff0c;如变换矩阵、颜色等。步骤&#xff1a; 在Shader中声明Uniform变量&#xff1a;uniform mat4 uMVPMatrix; // 例如…

华为总部-华为东莞松山湖基地参观游学攻略

你有听说过全球科技巨头-华为吗&#xff1f;今天带你深入了解这一世界标杆工厂的秘密基地。跟随华研标杆游学服务商一窥华为的强大实力。 在东莞松山湖&#xff0c;这里不仅仅是华为的终端总部&#xff0c;更是研发、销售和增值业务的核心区域。我们一行人抵达后&#xff0c;立…

Linux小知识

1. /etc目录 我们在配置文件中一直会调用 /etc目录 cd /etc/xxxx.conf etc的全称是editable configuration&#xff08;其中一种说法&#xff09;意为可编辑的配置&#xff1b;此目录主要用来存放系统的配置文件和初始化文件的&#xff1b;像网络配置 用户信息 各种服务的配置…

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

对接马来西亚、印度、韩国、越南等全球金融数据示例

Python对接StockTV全球金融数据API的封装实现及使用教程&#xff1a; import requests import websockets import asyncio from typing import Dict, List, Optional, Union from datetime import datetimeclass StockTVClient:"""StockTV全球金融数据API客户端…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以实现将多个元素进行合成&#xff0c;实现特殊效果。AE的项目文件是aep&#xff0c;可以将素材、层、效果等一切信息&#xff0c;保存在这个项目文件中。 AE的原理&#xff0c;和PS的原理非常类似。 操作界面 操作界面如…

【React】基于自定义Hook提取公共逻辑

目录 自定义Hook自定义Hook 1自定义Hook 2使用 注意事项 自定义Hook 作用&#xff1a;提取封装一些公共的处理逻辑 玩法&#xff1a;创建一个函数&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在组件中调用这个方法&#xff01; 自定义Hook 1 页面加载的时候修改浏…

AUTOSAR与arxml的文档解析

如下是文档脑图 一、文档概述 该文档是 AUTOSAR 经典平台的应用接口用户指南&#xff0c;主要解释 **Al Table&#xff08;应用接口表&#xff09;** 的结构、方法论及相关技术细节&#xff0c;帮助开发者理解如何通过标准化接口实现软件组件的互操作性。 关键内容 目的&#…

油候插件、idea、VsCode插件推荐(自用)

开发软件&#xff1a; 之前的文章&#xff1a; 开发必装最实用工具软件与网站 推荐一下我使用的开发工具 目前在用的 油候插件 AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 让查询变成多列&#xff0c;而且可以流式翻页 Github 增强 - 高速下载 github下载 TimerHo…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…

Spring Cache 实战指南

redis中常见的问题 前言 在本文中&#xff0c;我们将探讨 Redis 在缓存中的应用&#xff0c;并解决一些常见的缓存问题。为了简化理解&#xff0c;本文中的一些配置是直接写死的&#xff0c;实际项目中建议将这些配置写入配置文件&#xff0c;并通过配置文件读取。 一、为什…

区块链开发技术公司:引领数字经济的创新力量

在数字化浪潮席卷全球的今天&#xff0c;区块链技术作为新兴技术的代表&#xff0c;正以其独特的去中心化、不可篡改和透明性等特点&#xff0c;深刻改变着各行各业的发展格局。区块链开发技术公司&#xff0c;作为这一领域的先锋和推动者&#xff0c;正不断研发创新&#xff0…