MySQL事务 – 原子性、一致性、隔离性和持久性

MySQL事务

在数据库中,事务是一组数据库操作的集合,它们作为一个单独的执行单元进行处理。事务具有以下特性:

  1. 原子性:事务是一个不可分割的工作单位,要么全部执行成功,要么全部失败。
  2. 一致性:事务执行前后,数据库的状态保持一致。
  3. 隔离性:并发执行的事务之间相互隔离,互不干扰。
  4. 持久性:事务一旦提交,对数据库的修改就是永久性的。

事务的ACID属性

事务的ACID属性是指事务的四个特性分别为:

  • 原子性(Atomicity):事务的操作要么全部成功,要么全部失败回滚。
  • 一致性(Consistency):事务执行前后数据库的状态保持一致。
  • 隔离性(Isolation):并发执行的事务之间相互隔离,互不干扰。
  • 持久性(Durability):事务提交后的修改对数据库的影响是永久性的。

事务操作

MySQL提供了以下几个关键字来操作事务:

  • START TRANSACTION:开始一个新的事务。
  • COMMIT:提交当前事务的修改。
  • ROLLBACK:回滚当前事务的修改。

示例代码

下面是一个使用事务来转账的示例代码:

START TRANSACTION; -- 开始事务

DECLARE balance1 INT; -- 变量balance1用于保存账户1的余额
DECLARE balance2 INT; -- 变量balance2用于保存账户2的余额

-- 查询账户1的余额并赋值给变量balance1
SELECT balance INTO balance1 FROM accounts WHERE account_id = 1;

-- 查询账户2的余额并赋值给变量balance2
SELECT balance INTO balance2 FROM accounts WHERE account_id = 2;

-- 检查账户1的余额是否足够
IF balance1 >= 1000 THEN
    -- 更新账户1的余额
    UPDATE accounts SET balance = balance1 - 1000 WHERE account_id = 1;
    
    -- 更新账户2的余额
    UPDATE accounts SET balance = balance2 + 1000 WHERE account_id = 2;
    
    COMMIT; -- 提交事务
ELSE
    -- 余额不足,回滚事务
    ROLLBACK;
END IF;

在上面的示例代码中,我们使用事务来进行账户间的转账操作。首先,通过使用SELECT语句查询账户1和账户2的余额,并将结果赋值给变量balance1和balance2。然后,我们检查账户1的余额是否足够大以进行转账。如果足够大,则更新账户1和账户2的余额,并提交事务。否则,回滚事务。

通过使用事务,我们可以保证转账操作的原子性,即要么全部成功,要么全部失败。

事务隔离级别

MySQL支持多个事务隔离级别,它们决定了并发执行的事务之间的可见性和相互影响。

MySQL的事务隔离级别如下:

  • READ UNCOMMITTED(未提交读):事务可以读取未提交的数据,可能会导致脏读、不可重复读和幻读。
  • READ COMMITTED(已提交读):事务只能读取已提交的数据,可以避免脏读,但可能会导致不可重复读和幻读。
  • REPEATABLE READ(可重复读):事务在整个过程中都可以读取相同的数据,可以避免脏读和不可重复读,但可能会导致幻读。
  • SERIALIZABLE(串行化):事务完全串行化执行,可以避免脏读、不可重复读和幻读,但可能会导致性能降低。

设置事务隔离级别

可以使用以下语句设置事务隔离级别:

SET TRANSACTION ISOLATION LEVEL level;

其中level可以是以下值之一:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

例如,要将事务隔离级别设置为READ COMMITTED,可以执行以下语句:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

备注:默认情况下,MySQL的事务隔离级别是REPEATABLE READ

© 版权声明
THE END
喜欢就支持一下吧
点赞10赞赏 分享