MySQL默认隔离级别REPEATABLE-READ并没有解决幻读问题
刷脉脉,发现一个帖子讨论幻读问题:
固做一下实验,演示下MySQL默认隔离级别REPEATABLE-READ并没有解决幻读问题
幻读演示
MySQL默认隔离级别REPEATABLE-READ(可重复读)
会话一 |
会话二 |
MySQL [test]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ 4 rows in set (0.000 sec) |
MySQL [test]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ 4 rows in set (0.000 sec) |
MySQL [test]> begin; Query OK, 0 rows affected (0.000 sec)
注:开启事务一 |
MySQL [test]> begin; Query OK, 0 rows affected (0.000 sec)
注:开启事务二 |
MySQL [test]> insert into t1 values(5); Query OK, 1 row affected (0.000 sec)
MySQL [test]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.000 sec)
注:插入一条数据5 |
MySQL [test]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ 4 rows in set (0.000 sec)
注:因会话一未提交,所以在会话二事务里是看不见更改后的结果的 |
MySQL [test]> commit; Query OK, 0 rows affected (0.002 sec)
注:会话一执行事务提交 |
|
MySQL [test]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ 4 rows in set (0.000 sec)
MySQL [test]> update t1 set id = id+10; Query OK, 5 rows affected (0.001 sec) Rows matched: 5 Changed: 5 Warnings: 0
注:执行全表更新,id+10 |
|
MySQL [test]> select * from t1; +------+ | id | +------+ | 11 | | 12 | | 13 | | 14 | | 15 | +------+ 5 rows in set (0.000 sec)
注:当再次查看时,此时发现有5条数据被更改,产生幻读 |
|
MySQL [test]> select version(); +-----------+ | version() | +-----------+ | 8.0.21 | +-----------+ 1 row in set (0.000 sec) |
在MySQL默认隔离级Repeatable Read下,刚才的操作,在会话二未提交的事务里,
会莫名其妙地看到第5条数据,这种现象称为幻读。
固只能通过select ... for update才能避免幻读。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
众多防毒软件有漏洞, 可被攻击者用来提升特权
有网络安全研究人员发现,之前一些防毒软件中都有安全漏洞,可以让攻击者提升他们的特权从而使恶意软件可以在系统内隐藏更久,就连Windows自带的Defender也是一样。 根据网络安全研究机构CyberArk的一份报告显示,这些防毒软件普遍都是需要高特权来运作的,因此在对面文件修改攻击时它们会更易遭殃,从而导致恶意软件获得更高特权。这次受到影响的防毒软件有知名的卡巴斯基、迈克菲、赛门铁克、小红伞等,还包括Windows默认的Defender。不过这些软件都已经得到了相对应的修复,所以问题不大。 在这些安全漏洞中,最重大的有两个:可以从任意位置删除档案,使攻击者可以删除系列内的任何档案;以及可以允许攻击者抹去档案中所有内容。 根据CyberArk的说法,这些漏洞是由Windows的“ C:\ ProgramData”文件夹的默认DACL(自由访问控制列表)导致的,它们可以让应用程序存储数据而无需其他特权。由于每个用户对于根目录都有写入及删减特权,因此当一个非特权的程序在"ProgramData"创建一个新档案时,它在之后被提升特权的可能性就会增加。另外,研究人员也发现可以在执行特权进程之前...
-
下一篇
面试命中率90%的点 —— MySQL锁
一、对MySQL的锁的了解 当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。 就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。 二、隔离级别与锁的关系 在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突 在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁。 在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。 SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。 三、按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法 在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。 MyISAM和InnoDB存...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- MySQL数据库在高并发下的优化方案
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果