MySQL基础:事务

MySQL的事务的概念与操作

AvatarYuan·2025-03-18·21

MySQL 事务

1. 事务的概念

事务(Transaction)是数据库操作的最小逻辑单元,由一组 SQL 语句组成。事务具有 ACID 特性:

  • 原子性(Atomicity):事务要么全部执行成功,要么全部失败回滚。
  • 一致性(Consistency):事务执行前后,数据库状态保持一致(如约束、触发器等)。
  • 隔离性(Isolation):多个事务并发执行时,互不干扰。
  • 持久性(Durability):事务提交后,修改永久保存到数据库。

2. 事务控制语句

  • START TRANSACTIONBEGIN:显式开启事务。
  • COMMIT:提交事务,永久保存修改。
  • ROLLBACK:回滚事务,撤销所有未提交的操作。
  • SAVEPOINT:设置保存点,允许部分回滚。

3. 事务示例

示例 1:转账操作(原子性)
START TRANSACTION;
-- 账户 A 扣款 100
UPDATE account SET balance = balance - 100 WHERE user_id = 'A';
-- 账户 B 收款 100
UPDATE account SET balance = balance + 100 WHERE user_id = 'B';

-- 检查是否出错
IF (无错误) THEN
    COMMIT; -- 提交事务
ELSE
    ROLLBACK; -- 回滚事务
END IF;
示例 2:订单与库存一致性
START TRANSACTION;
-- 插入订单记录
INSERT INTO orders (order_id, product_id, quantity) VALUES (1001, 1, 2);
-- 减少库存
UPDATE products SET stock = stock - 2 WHERE product_id = 1;

-- 若库存不足或其他错误
IF (库存 < 0) THEN
    ROLLBACK; -- 回滚,取消订单和库存修改
ELSE
    COMMIT; -- 提交事务
END IF;
示例 3:保存点(Partial Rollback)
START TRANSACTION;
INSERT INTO logs (message) VALUES ('Step 1');
SAVEPOINT step1;

INSERT INTO logs (message) VALUES ('Step 2');
SAVEPOINT step2;

-- 回滚到 step1,撤销 Step 2 的操作
ROLLBACK TO step1;

COMMIT; -- 最终只有 Step 1 被提交

4. 事务隔离级别

MySQL 支持 4 种隔离级别(默认是 REPEATABLE READ):

  1. READ UNCOMMITTED:可能读到未提交的数据(脏读)。
  2. READ COMMITTED:只能读到已提交的数据。
  3. REPEATABLE READ(默认):保证同一事务多次读取结果一致。
  4. SERIALIZABLE:完全串行化,避免并发问题。

设置隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

5. 注意事项

  • 隐式提交:部分语句(如 ALTER TABLE)会自动提交当前事务。
  • 避免长事务:长时间未提交的事务可能导致锁竞争和性能问题。
  • 死锁处理:MySQL 会自动检测死锁并回滚其中一个事务。

通过事务,可以确保复杂操作的可靠性和数据一致性,尤其在金融、电商等高并发场景中至关重要。