Mysql中事务的四个隔离等级如何理解?如何解决脏读、不可重复读、幻读?

一、什么是事务?
一个或一组sql语句组成一个执行单元,要么全部执行,要么全部不执行,这便是事务。(事务是由很多条语句组成的,在组成事务语句的最后的一条语句中可以使用commit来执行事务,也可以使用rollback回滚不执行事务

二、什么是脏读、不可重复读、幻读?(以下只是举例子,并不是定义)
脏读(只查询一次):对于A,B两个Mysql终端来说,A在一个事务中更新了数据库C的数据但是未提交,当B查看数据库的数据时发现数据已经变了,但是当A选择rollback时,其实数据库C的数据并没有变。
不可重复读(查询两次):对于A,B两个Mysql终端来说,A在一个事务中更新了数据库C的数据但是未提交,B查询读的是一种数据,等终端A选择rollback提交后,B再查询读的是另外一种语句,两次查询的结果不一样就是不可重复读。
幻读(只针对于插入数据):对于A,B两个Mysql终端来说,数据库C本来只有两条语句,A终端插入了一条语句后,B通过update更新语句,B发现有三条语句受到了影响,这就是幻读。

三、事务隔离等级是如何解决这些问题的?
事务的四个隔离级别分别是:
1、读取未提交内容(Read Uncommitted);
2、读取提交内容(Read Committed);
3、可重读(Repeatable Read);
4、可串行化(Serializable)。

对于第一个隔离等级,即读取未提交内容。对于A,B两个Mysql终端,当A更新了数据库C的内容,B会查询到更新的内容,故这种等级最差,三种现象都会出现。

对于第二个隔离等级,即读取提交内容。对于A,B两个Mysql终端,当A更新了数据库C的内容但是未提交,B不会查询到更新的内容,故脏读不会出现,但是当A选择commit提交后,B再次查询发现和之前查询的不一样,这便出现了不可重复读。
这种等级会出现不可重复读,幻读。

对于第三个隔离等级,即可重复读。对于A,B两个Mysql终端,当A更新了数据库C的内容但是未提交,B不会查询到更新的内容,等A选择commit提交后,B还是查询不到更新的内容,只有等B终端自己的事务的最后一条语句选择commit提交后,再次查询,才能查到更新的内容,这便解决了不可重复读。但是如果A终端插入了一条语句,B终端通过update想修改语句时,会发现比以往多一条的语句出现了影响,还是有幻读。

对于第四个隔离等级,即可串行化。对于A,B两个Mysql终端,A准备往数据库C插入数据,但是A的插入行为被制止了,只有等B选择commit语句结束后,A才能插入数据,这就解决了幻读。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知所措。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值