MySQL 事务详细说明

事务(Transaction) 是数据库操作的最小工作单元,包含一组操作,这些操作要么全部成功,要么全部失败。事务具有以下四个特性(ACID):

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间状态。

  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的操作不会影响其他事务。

  4. 持久性(Durability):事务一旦提交,对数据库的修改是永久性的,即使系统崩溃也不会丢失。

事务控制语句

  1. BEGIN 或 START TRANSACTION:开始一个事务。

  2. COMMIT:提交事务,使所有修改永久生效。

  3. ROLLBACK:回滚事务,撤销所有未提交的修改。

  4. SAVEPOINT:在事务中设置保存点,可以回滚到该点。

  5. RELEASE SAVEPOINT:删除保存点。

  6. SET TRANSACTION:设置事务的隔离级别。

事务案例

假设有一个银行账户表 accounts,结构如下:

CREATE TABLE accounts (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    balance DECIMAL(10, 2)
);

插入两条记录:

INSERT INTO accounts (id, name, balance) VALUES (1, 'Alice', 1000.00);
INSERT INTO accounts (id, name, balance) VALUES (2, 'Bob', 500.00);

案例:转账操作

Alice 向 Bob 转账 200 元,需要确保两个账户的余额更新要么全部成功,要么全部失败。

START TRANSACTION;

-- Alice 账户扣除 200 元
UPDATE accounts SET balance = balance - 200 WHERE id = 1;

-- Bob 账户增加 200 元
UPDATE accounts SET balance = balance + 200 WHERE id = 2;

-- 提交事务
COMMIT;

如果在执行过程中发生错误,可以使用 ROLLBACK 回滚事务:

START TRANSACTION;

-- Alice 账户扣除 200 元
UPDATE accounts SET balance = balance - 200 WHERE id = 1;

-- 假设这里发生了错误
-- Bob 账户增加 200 元
UPDATE accounts SET balance = balance + 200 WHERE id = 2;

-- 回滚事务
ROLLBACK;

保存点案例

START TRANSACTION;

-- Alice 账户扣除 200 元
UPDATE accounts SET balance = balance - 200 WHERE id = 1;

-- 设置保存点
SAVEPOINT before_bob_update;

-- Bob 账户增加 200 元
UPDATE accounts SET balance = balance + 200 WHERE id = 2;

-- 假设这里发生了错误,回滚到保存点
ROLLBACK TO before_bob_update;

-- 提交事务
COMMIT;

事务隔离级别

MySQL 支持四种事务隔离级别:

  1. READ UNCOMMITTED:最低隔离级别,允许读取未提交的数据变更。

  2. READ COMMITTED:只能读取已提交的数据。

  3. REPEATABLE READ(默认):确保同一事务中多次读取同一数据的结果一致。

  4. SERIALIZABLE:最高隔离级别,完全串行化执行事务。

设置隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

总结

事务是确保数据库操作一致性和完整性的重要机制。通过合理使用事务控制语句和隔离级别,可以有效管理并发操作,避免数据不一致的问题。

本篇文章内容来源于:MySQL 事务详细说明以及案例