MySQL事务

事务是数据库管理系统的核心特性,它确保数据库操作要么完全成功,要么完全失败,保持数据的一致性和完整性。

1、事务基础概念

1.1 什么是事务?

事务是一组原子性的 SQL 操作,这些操作要么全部执行成功,要么全部失败回滚。事务将数据库从一种一致状态转换为另一种一致状态。

1.2 ACID 特性

特性 描述 实现机制
原子性 (Atomicity) 事务不可分割,要么全部成功,要么全部失败 Undo Log
一致性 (Consistency) 事务使数据库从一个有效状态转换到另一个有效状态 应用层 + 数据库约束
隔离性 (Isolation) 并发事务相互隔离,互不干扰 锁机制 + MVCC
持久性 (Durability) 事务提交后,修改永久保存 Redo Log

2、MySQL 事务操作

2.1 事务控制语句

-- 开启事务
START TRANSACTION;  -- 或 BEGIN

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- 设置保存点
SAVEPOINT savepoint_name;

-- 回滚到保存点
ROLLBACK TO savepoint_name;

-- 释放保存点
RELEASE SAVEPOINT savepoint_name;

2.2 事务模式设置

-- 查看事务自动提交状态
SHOW VARIABLES LIKE 'autocommit';  -- 默认ON

-- 禁用自动提交
SET autocommit = 0;

-- 启用自动提交
SET autocommit = 1;

2.3 完整事务示例

START TRANSACTION;

-- 账户A扣款
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';

-- 账户B收款
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';

-- 验证余额
SELECT balance FROM accounts WHERE account_id = 'A' FOR UPDATE;

-- 根据业务逻辑决定提交或回滚
IF (SELECT balance FROM accounts WHERE account_id = 'A') >= 0 THEN
    COMMIT;
ELSE
    ROLLBACK;
END IF;

3、事务隔离级别

3.1 并发问题

问题 描述 示例
脏读 读取到未提交的数据 事务A读取事务B未提交的修改
不可重复读 同一事务内多次读取结果不同 事务A两次读取间数据被事务B修改
幻读 同一查询返回不同行数 事务A查询期间事务B插入新行

3.2 隔离级别对比

隔离级别 脏读 不可重复读 幻读 性能 实现机制
READ UNCOMMITTED 最高 无锁
READ COMMITTED 行锁
REPEATABLE READ (MySQL默认) MVCC+间隙锁
SERIALIZABLE 最低 表锁

3.3 设置隔离级别

-- 查看当前隔离级别
SELECT @@transaction_isolation;

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

-- 设置全局级隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
posted @ 2025-09-08 17:58  xclic  阅读(27)  评论(0)    收藏  举报