MySQL事务等级
事务是什么
事务(transaction)是指一个完整的业务逻辑单元,要么同时成功要么同时失败。与事务相关的语句包括数据操作语句DML(Data Manipulation Language),如INSERT INTO、DELETE、UPDATE。在事务中,每一条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;