Skip to content

事务处理

事务是一组 SQL 操作,要么全部成功,要么全部失败。本章介绍事务的使用。

ACID 特性

  1. 原子性(Atomicity):全部成功或全部失败
  2. 一致性(Consistency):数据保持一致状态
  3. 隔离性(Isolation):事务之间相互隔离
  4. 持久性(Durability):提交后永久保存

基本语法

sql
-- 开始事务
START TRANSACTION;
-- 或
BEGIN;

-- 执行 SQL 操作
INSERT INTO users (name) VALUES ('Zhang San');
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- 提交事务
COMMIT;

-- 或回滚事务
ROLLBACK;

转账示例

sql
START TRANSACTION;

-- 从账户 A 扣款
UPDATE accounts 
SET balance = balance - 100 
WHERE id = 1;

-- 向账户 B 加款
UPDATE accounts 
SET balance = balance + 100 
WHERE id = 2;

-- 检查余额
IF (SELECT balance FROM accounts WHERE id = 1) >= 0 THEN
    COMMIT;
ELSE
    ROLLBACK;
END IF;

隔离级别

sql
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 隔离级别:
-- READ UNCOMMITTED - 读未提交
-- READ COMMITTED - 读已提交
-- REPEATABLE READ - 可重复读(MySQL 默认)
-- SERIALIZABLE - 串行化

保存点

sql
START TRANSACTION;

INSERT INTO users (name) VALUES ('User 1');
SAVEPOINT sp1;

INSERT INTO users (name) VALUES ('User 2');
SAVEPOINT sp2;

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

COMMIT;

最佳实践

  1. 保持事务简短
  2. 避免用户交互
  3. 合理设置隔离级别
  4. 处理死锁
  5. 使用索引减少锁定

小结

  • 事务保证数据一致性
  • ACID 特性
  • BEGIN/COMMIT/ROLLBACK
  • 隔离级别
  • 保存点

下一步: 学习 DATABASE-DESIGN 数据库设计