Mysql设置事务隔离级别解说(主演:咖啡汪,隔壁加菲猫)

不可重复读:一个事务范围内,两个相同的查询却返回了不同的结果;
重复读: 一个事务执行期间,不允许另一个事务执行update操作;
eg:加菲早上借了汪哥的卡,说是下午去买包包,卡里有1000元
1、执行查询操作:加菲借卡时当面查了卡里余额:1000元
2、执行update操作:结果中午本汪出去吃饭时,和隔壁柴犬互相挑衅,一时没忍住干了一架,把他咬伤了
于是乎,用手机把卡里的钱,全陪给柴犬媳妇了。
3、执行查询操作:加菲挑好了包包,付款时发现卡里余额:0元,直接炸毛了,于是乎汪哥帅气的脸,当天晚上就被猫爪挠得。。。。。。惨不忍睹
关键:卡从给了加菲的那一刻起,本汪就不能再用里面的钱了

脏读:一个事务可以读取另一个事务未提交的数据;一旦另一个事务进行回滚,所读数据即是脏数据;

eg:
加菲上个月从汪哥这儿借走200元,但她压根儿没想还,所以开始行骗,心机喵都这样

1.事务开始:
2.执行update操作:加菲往汪哥账户打了200元。然后立刻告诉本汪去查
3.执行查询操作:本汪查卡,确实多了200元,就以为加菲已经还钱了,就把借条还给了加菲
4.执行回滚rollback:加菲拿到借条后,立即回滚
本汪说明:此时由于事务还未提交,钱并没有真的到汪哥账户,所以允许回滚,加菲rollback后
5.本汪约了汪友一起撸串,付款时发现钱不够,聪明如本汪,于是乎借机省了200元串钱,哈哈哈
关键点:正常情况下‘操作3’查询的结果是不会多那200元的,未提交的数据查不到才对

事务的隔离级别共四种:
1)read uncommitted : 读取尚未提交的数据 :就是脏读
2)read committed:读取已经提交的数据 :可以解决脏读
3)repeatable read:重读读取:可以解决脏读 和 不可重复读
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表

mysql默认的是repeatable read

查询Mysql默认隔离级别
select @@global.tx_isolation,@@tx_isolation;
设置Mysql隔离级别read committed
set global transaction isolation level read committed;

猜你喜欢

转载自blog.csdn.net/weixin_42994251/article/details/107736634