MySQL事务等级

事务是什么

事务(transaction)是指一个完整的业务逻辑单元,要么同时成功要么同时失败。与事务相关的语句包括数据操作语句DML(Data Manipulation Language),如INSERT INTODELETEUPDATE。在事务中,每一条DML语句都会被记录到“事务性活动日志”文件中,可以选择提交(成功)或回滚(失败)。除此之外,对于InnoDB处理死锁的方案是,将持有最少行级排他锁的事务进行回滚,以解决死锁情况。

事务操作语法

🍟 查看当前事务等级
# 新:
SELECT @@TRANSACTION_ISOLATION;

# 旧:
SELECT @@tx_isolation;

/*
+-------------------------+
| @@TRANSACTION_ISOLATION |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)
*/
🍔 执行事务
# 1.开启(关闭mysql自动提交机制)
START TRANSACTION;

# 2.数据操作 DML
INSERT INTO student(name, age) VALUES('张三', 12), ('李四', 15);

# 3.1 回滚
ROLLBACK;

# 3.2 提交
COMMIT;

事务等级类

(1)🚁 读未提交 READ UNCOMMITTED
# 含义:事务A可以读取事务B未提交的数据
# 问题:可能存在脏读(脏数据)
# 简称:没有提交(COMMIT) 就 可以读取(SELECT)

# 设置全局事务模式为:读未提交
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
(2)🚍 读已提交 READ COMMITTED
# 含义:事务A只能读取到事务B已提交的数据
# 问题:不可重复读取数据
# 优点:解决了脏读问题(事务没有结束,第一次读是3条,第二次是4条)
# 简称:提交之后才能读取
# 注意:Oracle默认该档

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
 (3)🚘 可重复读 REPEATABLE COMMITTED
# 含义:事务A开启读取事务B数据,无论事务B数据是否改变,事务A读取的数据仍不变化
# 问题:幻影读(可能每次读取的数据都是幻象,不真实)
# 优点:解决了不可重复读问题
# 简称:提交之后也读不到(读取的都是事务刚开启时的数据)
# 注意:Mysql默认该档

SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
(4)🛰 序列化读 SERIALIZABLE
# 含义:每次读到的数据都是最真实的,线程同步,事务排队
# 问题:效率低,无法并发,类似于JS的同步任务(排队)
# 优点:解决以上全部问题

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
 

© 著作权归作者所有 转载请注明原链接