MySQL事务详解

事务详解

事务是关系型数据库的核心特性之一,用于确保数据操作的一致性和可靠性

目录


基本概念

事务(Transaction)是一组原子性的数据库操作序列,具有以下核心特征:

(事务操作要么全部成功,要么全部回滚)

  • 不可分割:事务中的操作作为整体执行
  • 状态一致性:无论成功与否,总能保持数据库的合法状态
  • 执行边界 :明确的开始(BEGIN)和结束(COMMIT/ROLLBACK)标记

事务操作

管理方式对比

方式 自动提交 控制方法 适用场景
隐式事务 开启(默认) 系统自动管理 简单单语句操作
显式事务 关闭 手动COMMIT/ROLLBACK 复杂多步骤操作

操作语法

mysql 复制代码
-- 方式1:修改自动提交设置
SET @@autocommit = 0; -- 关闭自动提交
-- 执行DML语句...
COMMIT; -- 成功时提交
ROLLBACK; -- 失败时回滚

-- 方式2:显式事务块
START TRANSACTION;
-- 执行DML语句...
COMMIT; -- 成功提交
ROLLBACK; -- 失败回滚

完整示例

mysql 复制代码
-- 账户表结构
CREATE TABLE account(
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name VARCHAR(10) COMMENT '账户名',
    money INT COMMENT '余额'
) COMMENT '银行账户';

-- 显式事务示例
SET @@autocommit = 1; -- 确保自动提交开启
BEGIN;
UPDATE account SET money = money - 1000 WHERE name = 'wjj';
UPDATE account SET money = money + 1000 WHERE name = 'jjw';
COMMIT;

-- 异常处理示例
START TRANSACTION;
SAVEPOINT before_transfer; -- 创建保存点
UPDATE account SET money = money - 2000 WHERE name = 'wjj';
-- 假设此时发现异常
ROLLBACK TO before_transfer; -- 回滚到保存点
COMMIT;

ACID特性

特性 描述 实现机制
原子性 事务是不可分割的最小工作单元 Undo Log(回滚日志)
一致性 保证数据库始终从一种合法状态转换到另一种合法状态 约束检查 + 事务机制
隔离性 并发事务之间相互隔离 MVCC + 锁机制
持久性 事务提交后对数据库的修改是永久的 Redo Log(重做日志)

并发事务问题

典型并发问题

问题类型 现象描述 隔离级别解决方案
脏读 读取到其他事务未提交的数据 Read Committed及以上
不可重复读 同一查询多次访问结果不同(数据被修改) Repeatable Read及以上
幻读 同条件查询结果集数量变化(数据被新增/删除) Serializable

事务隔离级别

标准隔离级别对比

隔离级别 脏读 不可重复读 幻读 性能
Read Uncommitted ✔️ ✔️ ✔️ 最高
Read Committed ✖️ ✔️ ✔️ 较高
Repeatable Read(默认) ✖️ ✖️ ✔️ 中等
Serializable ✖️ ✖️ ✖️ 最低

隔离级别管理

mysql 复制代码
-- 查看当前隔离级别
SELECT @@TRANSACTION_ISOLATION;

-- 设置全局隔离级别(需重启会话)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

最佳实践

  1. 事务粒度控制

    • 保持事务简短(尽量在1秒内完成)
    • 避免事务中包含用户交互
  2. 隔离级别选择

    • 默认使用Repeatable Read
    • 高并发场景可降级为Read Committed
  3. 异常处理

    • 配合SAVEPOINT实现部分回滚
    • 使用DECLARE...HANDLER捕获处理错误
  4. 性能优化

    • 长事务定期检查点
    • 合理使用行锁/表锁

附:MySQL官方事务文档 链接

相关推荐
进击的荆棘6 分钟前
MySQL——在ubuntu环境下安装MySQL
数据库·mysql·ubuntu
hey you~26 分钟前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
夜雪一千36 分钟前
MySQL 数据字典如何获得
数据库·mysql
系统集成-鹰翔40 分钟前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
QianhangQianping42 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
honsor43 分钟前
用 Grafana 做温湿度异常检测:从阈值告警到趋势预测
数据库·mysql·php
赵渝强老师1 小时前
【赵渝强老师】YashanDB Developer Center(YDC,崖山数据库开发者中心)
数据库·国产数据库·yashandb·崖山数据库
lusklusklusk1 小时前
SQL Server 为什么普通 SELECT 会阻塞 UPDATE?——行级 S 锁到表级 S 锁的锁升级原理与实验验证
数据库·mysql·oracle
Leo.yuan1 小时前
企业业务人员如何独立完成数据分析?2026年自助BI工具选型与应用指南
大数据·数据库·人工智能
roman_日积跬步-终至千里1 小时前
数仓开发的三层责任:业务定义、模型设计与 SQL 实现
数据库·数据仓库·sql·数据建模