事务

tim-qtp2025年2月8日...大约 2 分钟MySQL数据库

MySQL 事务的四大特性?

ACIDopen in new window

事务的基本操作

MySQL 中通过以下语句控制事务:

  • 开启事务

    START TRANSACTION;
    

    BEGIN;
    
  • 提交事务

    COMMIT;
    
  • 回滚事务

    ROLLBACK;
    

转账案例:

-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
rollback;

MySQL 是如何实现事务的?

MySQL 主要是通过:锁、Redo Log 、Undo Log、MVCC 来实现事务。

MySQL 隔离性 利用MVCC(多版本并发控制)或锁机制来保证的。

Redo Log(重做日志),它会记录事务对数据库的所有修改,当 MySQL 发生宕机或崩溃时,通过重放 redolog 就可以恢复数据,用来满足事务的持久性。

Undo Log(回滚日志),它会记录事务的反向操作,简单地说就是保存数据的历史版本,用于事务的回滚,使得事务执行失败之后可以恢复之前的样子。实现原子性和隔离性

MVCC(多版本并发控制),满足了非锁定读的需求,提高了并发度,实现了读已提交和可重复读两种隔离级别,实现了事务的隔离性。

那一致性呢?

其实事务主要是为了实现一致性,具体是通过 AID,即原子性、隔离性和持久性来达到一致性的目的。

事务隔离级别:

查看事务隔离级别:

SELECT @@TRANSACTION_ISOLATION;
image-20250206173513426
image-20250206173513426

设置事务隔离级别:

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
image-20250206173617486
image-20250206173617486

从上到下,隔离级别越来越高,但是,事务隔离级别越高,数据越安全,但是性能越低。

串行化,相当于队列形式,一个一个来,一个事务没有提交,那另一个事务就不能操作。