事务
2025年2月8日...大约 2 分钟MySQL数据库
MySQL 事务的四大特性?
事务的基本操作
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;

设置事务隔离级别:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

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

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