结论

默认不会加读锁!但 MySQL InnoDB 的可重复读并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是 next-key locks。

隔离级别说明

MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)。

未提交读(READ UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。

提交读(READ COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。

可重复读(REPEATABLE READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。

串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

四个级别逐渐增强,每个级别解决一个问题。

脏读,最容易理解。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。

不重复读。解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。

幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始并且第一次查询时的状态(一致性)。但是,如果另一个事务同时提交了新数据,虽然本事务再次按照相同的条件查找会得到相同的结果集,但是本事务指定更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

所以 InnoDB 默认还是会出现幻读现象的,所以还是可能会加锁。

幻读的演示

银行A开启了一个事务窗口,查询当前系统中有没有"wangwu"用户,发现没有,银行B也开启了一个事务窗口,查询当前系统中也没有"wangwu"用户,银行A先创建"wangwu"用户并且提交,由于可重复读取,银行B在一次事务中必须保证查询的数据一致性,因此查询不到"wangwu",结果银行B窗口认为wangwu没有被注册想注册"wangwu"用户,就创建"wangwu"用户结果发现系统提示"wangwu"用户已经被注册",但是在本次事务中又查询不到"wangwu",就好像出现幻觉一样

create table user(

id int primary key,

username varchar(30),

money double

);

insert into user values(1,'zhangsan',100);

insert into user values(2,'lisi',100);

打开两个MySQL窗口

解决幻读可以提高事务隔离级别为 Serializable (串行化),它是使用的共享锁,当然 MySQL 有锁的类型:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。 还有非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。

mysql innodb 读加锁_InnoDB 读大量数据时会加读锁么?相关推荐

  1. mysql 保证事物完整性_数据库高并发请求,如何保证数据完整性?详解MySQL/InnoDB的加锁...

    本文是对MySQL/InnoDB中,乐观锁.悲观锁.共享锁.排它锁.行锁.表锁.死锁概念的理解,这些在面试中也经常遇到,如数据库高并发请求,如何保证数据完整性?今天我查阅资料进行了MySQL/Inno ...

  2. 【169期】面试官:同学,分析一下MySQL/InnoDB的加锁过程吧

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 17 分钟. 来自:cnblogs.com/crazylqy/p/7611069.html Hello,大家好,我是良月柒. ...

  3. Mysql(Innodb)如何避免幻读

    大龄菜逼初级DBA瞎JB写的,大家凑合看当个乐? 幻读Phantom Rows The so-called phantom problem occurs within a transaction wh ...

  4. MySQL InnoDB如何解决幻读?

    1 数据准备 CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRI ...

  5. mysql innodb 从 ibd 文件恢复表数据

    最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...

  6. MySQL InnoDB 锁介绍及不同 SQL 语句分别加什么样的锁

    作者:iceman1952(本文来自作者投稿) 本文中,我们详细介绍MySQL InnoDB存储引擎各种不同类型的锁,以及不同SQL语句分别会加什么样的锁. 阅读提示 1. 本文所参考的MySQL文档 ...

  7. mysql innodb myisam 区别_InnoDB与MyISAM的六大区别_MySQL

    bitsCN.com 本文主要整理了Mysql 两大常用的存储引擎MyISAM,InnoDB的六大常见区别,来源于Mysql手册以及互联网的资料 InnoDB与Myisam的六大区别 MyISAMIn ...

  8. mysql innodb 修复表_Innodb 表修复

    摘要: 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决过程, ...

  9. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

最新文章

  1. java实现在pdf文档上填充内容
  2. rust图形编程_国产编程语言“木兰”,你以为是个王者,结果是个玩笑
  3. CTFshow 反序列化 web277
  4. mongodb的id的唯一性_探讨MongoDB的_id字段含义,及对MongoDB数据库的重要性
  5. properties 配置回车_在Ubuntu上部署基于Docker的RSSHub,并配置SSL证书
  6. 什么技能产品经理不会提,但技术人必须懂?
  7. POJ - 3278 Catch That Cow 简单搜索
  8. 盲审不到4分的论文竟中了ICLR 2019??!!ICLR 2019官方这样回应
  9. Atom飞行手册翻译: 3.5 创建主题
  10. 04-linux下安装neo4j
  11. Python函数的参数
  12. R语言读取淘宝的单品页的名称和价格
  13. horizon服务主要模块_得助智能:智能外呼机器人有哪些模块功能层级?
  14. python的matplotlib画图时独立窗口_解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题...
  15. Android实战开发通用流行框架大全
  16. 调整图片大小的方法(变大或变小)
  17. JavaScript中获取键盘事件
  18. 乐理小课堂——自然/和声/旋律大调的调式音阶
  19. ui设计学习路线图分享送给初学者
  20. 爆肝1万字《c++入门综合》

热门文章

  1. fortran:使用IMSL函数库计算第一/二类完全椭圆积分
  2. ubuntu20有线网络无线网络
  3. 如何用OKR提高下属执行力
  4. Oracle报错ora03135,(转)连接到oracle10g,报ORA-03135异常
  5. python练习.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
  6. H3CTE讲师分享H3C实验7 PPP
  7. iOS 相机实时滤镜效果
  8. 超级列表框导入到mysql_易语言excel表格怎样导入到超级列表框
  9. 内置式永磁电机maxwell2d_基于ANSYSMaxwell2D分析异步起动永磁同步电机
  10. APS软件必须满足不同规划要求