mysql事务隔离级别及读问题的介绍

事务的四大隔离级别

序列化(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值