事务的四大隔离级别
序列化(SERIALIZABLE):如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离
可重复读(REPEATABLE READ):在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。mysql默认事务隔离级别
提交读(READ COMMITTED):READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于 READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果
未提交读(READ UNCOMMITTED):READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化
###三大读问题
脏读(存在于READ UNCOMMITTED):一个事务读到另外一个事务还没有提交的数据,称之为脏读。
#修改 当前会话隔离级别 未提交读READ UNCOMMITTED 只需要修改会话一的事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
# 会话一
START TRANSACTION;
UPDATE tb1 SET `name` = 'zhoumu' WHERE `name`='www' and id = 1;
# 会话二
SELECT * FROM tb1 WHERE id=1;
#结果 会话二而查询到会话一 未提交 的数据,查询到的名字为zhoumu
不可重复读(存在于READ COMMITTED,READ UNCOMMITTED):一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。其中的后是事务已提交后。
#修改当前会话隔离级别 修改全局READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
#会话一
START TRANSACTION;
UPDATE tb1 SET `name` = 'zhoumu' WHERE `name`='www' and id=1;
commit;
#会话二
SELECT * FROM tb1 WHERE id=1;
#结果 会话二在会话一为提交前查询到的名字为www,会话一事物提交后,查询到的名字为zhoumu
幻读(存在于REPEATABLE READ,READ COMMITTED,READ UNCOMMITTED):会话中查询不到某条数据,但是对该数据插入或修改是却又是存在的,也就是说查询到的值并非真实值
#修改当前会话隔离级别 修改全局READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
#会话一
START TRANSACTION;
INSERT tb1 VALUES(2,'test');
commit;
#会话二
SELECT * FROM tb1 WHERE id=1;
INSERT tb1 VALUES(2,'test');
#结果:在会话一未提交前执行会话二的插入,会话二将持续等待,而会话二查询时却查询不到数据已经插入的值,当会话一事务提交后,会话二才停止等待
参考视频:https://www.bilibili.com/video/BV14L4y1B7mB
|