MySQL基础二详解

本文详细探讨了数据库事务的四个隔离级别:读未提交、读已提交、可重复读和串行化,以及它们对脏读、不可重复读和幻读的影响。通过实例展示了各隔离级别下可能出现的问题,并解释了回滚点的概念。同时,文章还讨论了如何设置和查看事务的隔离级别,以及在不同场景下选择合适隔离级别的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 演示事务的隔离级别

image.png

  • set后面加session比较好,不加直接查看当前隔离级别没有马上生效,效果没出来,加session代表设置当前会话或连接隔离级别,比如说两个cmd窗口的事务就是不同的会话,
    事务的隔离级别是全局变量
看事务的隔离级别,并修改为(第一种)最低隔离级别 read-uncommitted(读未提交数据)

最低的隔离级别会出现脏读,不可重复读,幻读的情况

image.png

  • 事务1更新数据,但未提交

image.png

  • 事务2读取更新后的’john’临时数据,出现脏读

image.png

  • 若事务1回滚后,事务2再次读取数据,会回到更新前的’张无忌’的数据,出现不可重复读幻读

image.png

第二种隔离级别: read-committed(读已提交数据)

可以解决脏读,但不能解决不可重复读,幻读

  • 分别查看两个不同事务的隔离级别

image.png

image.png

  • 开启事务1,更新数据,在事务1还未结束的情况下,

image.png

  • 开启事务2,并查看数据,发现数据没有被修改,说明避免了脏读,但是还是不能避免不可重复读和幻读

image.png

  • 假如事务1提交了,但是事务2还没有结束,且在同一个事务2的多次查询下,会发现两次查询结果不一样,所以把这种现象称为不可重复读

事务1:

image.png

事务2:

image.png

第三种隔离级别: repeatable-read(可重复读)

可以解决脏读,不可重复读,但不能解决幻读

  • 设置两个事务的隔离级别为repeatable read,开启事务1,事务2;
    事务1修改数据,但未提交

image.png

  • 事务2显示数据没有改为’‘刘备’’,避免了脏读
    image.png

  • 若事务1提交了,

image.png

  • 事务2再次查询,数据还是不变,所以说对于同一个事务2多次查询来说,结果是一样的,解决了不可重复读的问题

image.png

当前事务2提交后再开一个新事务2,再次查询数据就是最新的

image.png

  • 第三种隔离级别幻读的情况
    1.重新开启两个事务,先在事务1中查看一下原本数据,

image.png

2.在事务2中插入新的数据,并且提交

image.png

3.在事务1中重新查询一下数据仍然还是2行,但是把所有的account表的username数据改为新的实际修改了3行,犹如出现幻觉,所以称为幻读.(幻读一般就针对插入数据)

image.png

事务2先一步修改了数据并且提交了,会造成事务1本来修改两行结果变成了3行

第四种最高隔离级别: serializable(串行化)

可以解决三种问题, 但是性能低

1.设置隔离级别为最高级别,开启两个事务,在事务1下查询数据,但未提交

image.png

2.在事务2中插入新数据,但事务2阻塞,只有事务1结束后才能执行事务2,因此解决了幻读的问题

image.png

事务的隔离级别:

脏读不可重复读幻读
read uncommitted
read uncommitted×
repeatable read××
serializable×××

回滚点的演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值