参考资料

  1. MySQL 函数详细说明以及案例
  2. MySQL 插入数据详细说明以及案例
  3. MySQL 创建数据库
  4. MySQL 选择数据库详细说明以及案例
  5. MySQL 处理重复数据详细说明以及案例
  6. MySQL 连接的使用详细说明以及案例
  7. MySQL GROUP BY 语句详细说明以及案例
  8. MySQL 元数据详细说明以及案例

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;

总结

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