当前位置: 首页 > news >正文

MYSQL——基础知识(SQL事务)

目录

前言

一、事务是什么?

二、事务的四大特性(ACID)

三、MySQL 事务控制语句

四、实战案例:安全转账

五、事务隔离级别(Isolation Levels)

六、自动提交模式(AUTOCOMMIT)

七、事务使用注意事项

八、总结:事务使用口诀


前言

在现代数据库系统中,事务(Transaction)是保障数据一致性和完整性的核心机制。无论是银行转账、订单支付,还是用户注册,背后都离不开事务的支撑。

想象这样一个场景:

张三向李四转账 100 元
这需要两步操作:

  1. 张三账户余额减 100;
  2. 李四账户余额加 100。

如果第一步成功,第二步因系统崩溃失败,就会导致资金凭空消失
MySQL 事务正是解决此类问题的“安全锁”——它确保这两步要么全部成功,要么全部失败

本文将深入讲解 MySQL 事务的原理、ACID 特性、控制语句、隔离级别及最佳实践。


一、事务是什么?

事务的定义

事务是一组 SQL 操作的逻辑单元,这些操作被视为一个整体:

  • 全部执行成功→ 提交(COMMIT),永久生效;
  • 任一操作失败→ 回滚(ROLLBACK),全部撤销。

重要前提

只有 InnoDB 存储引擎支持事务
MyISAM、MEMORY 等引擎不支持事务,操作会自动提交。


二、事务的四大特性(ACID)

特性英文说明示例
原子性Atomicity操作不可分割,全做或全不做转账两步必须同时成功或失败
一致性Consistency事务前后数据符合业务规则转账后总金额不变(1000 → 900+100)
隔离性Isolation并发事务互不干扰A 查余额时,B 的未提交转账不可见
持久性Durability提交后修改永久保存即使断电,已提交的转账不会丢失

ACID 是事务的“黄金标准”,缺一不可。


三、MySQL 事务控制语句

1. 开启事务

-- 方法1:显式开启 START TRANSACTION; -- 或 BEGIN; -- 方法2:关闭自动提交 SET AUTOCOMMIT = 0; -- 之后每条 DML 都属于事务,需手动 COMMIT/ROLLBACK

📌默认行为:MySQL 默认AUTOCOMMIT=1,即每条INSERT/UPDATE/DELETE自动提交!


2. 提交与回滚

-- 提交:永久保存更改 COMMIT; -- 回滚:撤销所有未提交的更改 ROLLBACK;

3. 保存点(Savepoint)—— 事务中的“检查点”

START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; SAVEPOINT before_transfer; -- 设置保存点 UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 若第二步出错,可回滚到保存点 ROLLBACK TO before_transfer; -- 最终决定提交或完全回滚 COMMIT; -- 或 ROLLBACK;

优势:实现事务内的“部分回滚”,提升灵活性。


四、实战案例:安全转账

-- 开启事务 START TRANSACTION; -- 扣款 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1 AND balance >= 100; -- 检查扣款是否成功(防止余额不足) IF ROW_COUNT() = 0 THEN ROLLBACK; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '余额不足'; END IF; -- 入账 UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 提交 COMMIT;

关键点

  • 使用ROW_COUNT()验证操作是否生效;
  • 通过SIGNAL抛出错误终止流程(需在存储过程中使用)。

五、事务隔离级别(Isolation Levels)

并发事务可能引发三大问题:

问题描述隔离级别解决情况
脏读(Dirty Read)读到其他事务未提交的数据READ COMMITTED 及以上解决
不可重复读(Non-repeatable Read)同一事务内多次读取结果不同REPEATABLE READ 及以上解决
幻读(Phantom Read)同一查询返回新插入的行SERIALIZABLE 解决

MySQL 支持的四种隔离级别

隔离级别(Isolation Level)脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read)性能表现
READ UNCOMMITTED允许允许允许最高
READ COMMITTED禁止允许允许较高
REPEATABLE READ(MySQL 默认)禁止禁止InnoDB 通过 MVCC 解决中等
SERIALIZABLE禁止禁止禁止最低(串行执行)

查看与设置隔离级别

-- 查看当前会话隔离级别 SELECT @@transaction_isolation; -- 设置当前会话隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置全局(影响新连接) SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

InnoDB 的优化
REPEATABLE READ下,InnoDB 通过MVCC(多版本并发控制)Next-Key Lock有效避免幻读,因此通常无需升级到SERIALIZABLE


六、自动提交模式(AUTOCOMMIT)

模式行为适用场景
AUTOCOMMIT=1(默认)每条 DML 自动提交简单脚本、交互式查询
AUTOCOMMIT=0需手动 COMMIT/ROLLBACK应用程序、复杂业务逻辑

在应用程序中使用

<?php $pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $pdo->beginTransaction(); // 相当于 SET AUTOCOMMIT=0 + START TRANSACTION $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1"); $pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2"); $pdo->commit(); // 提交 } catch (Exception $e) { $pdo->rollback(); // 回滚 throw $e; } ?>

最佳实践:应用程序中始终使用beginTransaction()+commit()/rollback()


七、事务使用注意事项

  1. 避免长事务
    长时间未提交的事务会:

    • 占用大量 undo 日志;
    • 阻塞 purge 线程;
    • 增加死锁概率。
  2. 合理选择隔离级别

    • 大多数场景REPEATABLE READ(默认)足够;
    • Oracle/SQL Server 默认是READ COMMITTED,注意兼容性。
  3. 死锁处理
    InnoDB 会自动检测死锁并回滚代价较小的事务。应用层应捕获Deadlock found错误并重试。

  4. 不要在事务中处理用户交互
    事务期间等待用户输入会导致锁长时间持有,影响并发性能。


八、总结:事务使用口诀

“InnoDB 才支持,ACID 要记牢;
BEGIN 开事务,COMMIT 才生效;
出错就 ROLLBACK,保存点更灵活;
默认可重复读,长事务要避免!”

掌握 MySQL 事务,不仅是写出正确代码的基础,更是构建高可靠、高并发系统的必备技能。合理运用事务,让你的数据在任何情况下都坚如磐石!

http://www.jsqmd.com/news/693615/

相关文章:

  • STM32F103VET6 CAN 双板通信实战:从配置到代码实现
  • 王其聪-简历
  • LogExpert:Windows平台最强日志查看工具,告别tail命令的繁琐操作
  • 保姆级教程:在Jetson Nano上搞定IMX219-83双目相机,从硬件连接到ROS驱动
  • 想学无人机编程但怕炸机?试试这个Unity模拟方案:从零配置飞行控制与传感器数据可视化
  • 虚拟机上玩转工业通讯:用Win7+VMware搭建倍福PLC Modbus-TCP测试环境全记录
  • 2026年广州最出名留学机构推荐:五家优选深度对比 - 科技焦点
  • OCR识别 + Excel导出:一键生成商品数据表(批量处理实战)
  • 普通人逆袭!靠游戏搬砖,每月稳稳月入两万
  • 3分钟快速上手:通达信缠论量化分析插件实战指南
  • 基于国家密码管理局发布的商用密码管理条例,国家关键信息基础设施必须采用国产密码算法。在这一政策背景下,国密CPU门禁系统应运而生,成为高安全场所门禁建设的首选方案杜绝NFC普及、卡片复制、射频嗅探泛滥
  • WarcraftHelper:终极魔兽争霸III兼容性修复指南 [特殊字符]
  • 2026年4月广州搬家/红木家具搬运/设备移/起重吊装/公司搬迁服务口碑深度解析,广东人人专业吊装搬运有限公司何以脱颖而出? - 2026年企业推荐榜
  • 2026升学率比较高的国际高中插班,深圳留学机构推荐 - 品牌2026
  • 多通道CNN在文本分类中的应用与实践
  • 抖音下载实战:解密批量下载与去水印的终极方案
  • 终极DLSS Swapper完全指南:3大核心功能解锁游戏性能新高度
  • ISO 26262 深度解读系列(二):Part 2 - 功能安全管理 第1章 Scope
  • 告别HAL库延迟:用STM32CubeMX配置LL库驱动串口,实现高效数据收发实战
  • 深圳服务优质的品牌设计公司推荐:2026 年企业如何选择靠谱的品牌升级机构 - 2026品牌推荐官
  • Wireshark抓包实战:当MQTT遇上TLS加密,如何解密并分析MQTTS数据包?
  • 从零搭建一个小型实验室网络:用FreeRADIUS和OpenWRT实现WPA2-Enterprise认证
  • 英雄联盟智能助手终极指南:如何用League Akari提升你的游戏体验
  • 如何5分钟完成飞书文档批量导出:开源工具终极指南
  • 掌握在线幻灯片创作:PPTist打造专业演示文稿的完整解决方案
  • 科技与港股同步承压,等待市场选择方向!
  • 北京土地纠纷律师张鑫:深耕领域数十年的维权专家 - 律界观察
  • 2026年嘉兴制造业短视频代运营:源头工厂获客全案破局指南 - 优质企业观察收录
  • Pandas数据分析实战:从快乐8开奖数据里,我们能发现什么规律?
  • 2026陕西学化妆哪家好?TOP5正规化妆学校避坑推荐,内行人权威揭秘 - 深度智识库