Mysql 隔离级别和锁(一)

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。


这里写图片描述


1、事务的4大特征ACID

Atomicity Consistency Isolation Durability(原子、一致、隔离、持久)
说明隔离级别脏读不可重复读幻读加锁
未提交读READ UNCOMMITTEDYESYESYEsNO
提交读READ COMMITTEDNOYESYEsNO
重复读REPEATABLE READNONOYEsNO
串行读SERIALIZABLENONONOYEs


2、四种隔离级别分别会产生的问题

ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。
对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现象:

脏读(Drity Read)

某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

示例:我们可以通过实例来具体的看一下什么叫做脏读,首先我们需要创建一个测试表 test

这里写图片描述

然后打开双窗口模拟迸发操作~

这里写图片描述

常用的命令:

查询事务的隔离级别,分别是:全局的、下次事务的、当前事务的隔离级别

show variables like '%storage_engine%';       查看当前的mysql引擎
show variables like 'autocommit'\G;     查看是否自动提交
select @@global.tx_isolation,@@tx_isolation,@@session.tx_isolation; 
set session transaction isolation level READ UNCOMMITTED;     修改当前事务隔离级别 

①、两个操作窗口同时开启事务,然后在右侧窗口更新其中的一条记录,左侧去查,我们看一下结果如何?

在此之前我们分别查一下当前事务的隔离级别是什么?

这里写图片描述

查询结果显示:
 当前mysql的隔离级别是:**REPEATABLE-READ** 重复读,这种隔离级别也是大多数mysql的默认的隔离级别,现在我们先测试未提交读(**read uncommitted**),那么我们首先需要将数据库的隔离级别修改一下

方法如下:

set session transaction isolation level READ UNCOMMITTED;

这里写图片描述

我们在左边的事务中修改某一条记录,然后在右边的事务中我们去查询这条记录看一下会是什么样的结果?

这里写图片描述

右边事务中我们获取到的值为id=4的name=14,然后我们去回滚左边事务。

这里写图片描述

注意:在测试的过程中发现了一个bug,那就是我的事务居然没有生效?这是什么原因呢?

这里写图片描述

答案:在mysql命令行的默认下,事务都是自动提交的,sql语句提交后马上会执行commit操作。因此开启一个事务必须使用begin,start transaction,或者执行 set autocommit=0;
才可以使用的事务控制语句。这块新手可能会遇到这个问题,需要注意一下。(还会有一种问题就是:一定要注意你所操作的当前表的存储引擎是什么?MYISAM不支持事务的,所以需要将表修改为innoDB,查看看方法:show create table test1; 修改方法:alter table test1 engin=innodb(老鸟一般都知道,只是建议小鸟们))

这里写图片描述

左边事务更新一条字段以后,查询表显示数据已经更新成功,右边事务查询表数据同样显示结果与左侧事务相同,然后我们回滚左边事务,再次查询发现数据还原了,右边事务查询结果显示数据跟上一次查询不一致,这就导致了右边事务之前所查询得到的数据是错误的数据,所以对于右边事务来说就造成了“脏读”。



后面演示请继续参考 Mysql 隔离级别和锁(二)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值