`
xjywp2008
  • 浏览: 7736 次
文章分类
社区版块
存档分类
最新评论

MYSQL 奇怪的幻读问题!!!

阅读更多
Mysql版本:5.6.27
事务隔离级别:Repeatable Read
导致出现问题的原因:timestamp 类型加了UPDATE CURRENT_TIMESTAMP

表结构:
CREATE TABLE `t_test` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `AMOUNT` smallint(6) DEFAULT NULL,
  `CREATED_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;


情景1:保留UPDATE CURRENT_TIMESTAMP配置
   前提:两个线程并发
   线程1:
      

          
  • 1. 开启事务
  •       
  • 2. 读取表select count(1) from t_test 结果为0
  •       
  • 3. 阻塞线程让线程2执行
  •       
  • 4. 更新表update t_test set AMOUNT = 10 返回执行的行数为1
  •       
  • 5. 读取表select count(1) from t_test 结果为0
  •       
  • 6. 事务结束
  •       


   线程2:
      

          
  • 1. 开启事务
  •       
  • 2. 插入数据 insert into t_test (AMOUNT) values (10)
  •       
  • 3. 事务结束
  •       


情景2:保留UPDATE CURRENT_TIMESTAMP配置
   前提:两个线程并发
   线程1:
      

          
  • 1. 开启事务
  •       
  • 2. 读取表select count(1) from t_test 结果为0
  •       
  • 3. 阻塞线程让线程2执行
  •       
  • 4. 更新表update t_test set AMOUNT = 5 返回执行的行数为1
  •       
  • 5. 读取表select count(1) from t_test 结果为1
  •       
  • 6. 事务结束
  •       


   线程2:
      

          
  • 1. 开启事务
  •       
  • 2. 插入数据 insert into t_test (AMOUNT) values (10)
  •       
  • 3. 事务结束
  •       



情景3:去除UPDATE CURRENT_TIMESTAMP配置
   前提:两个线程并发
   线程1:
      

          
  • 1. 开启事务
  •       
  • 2. 读取表select count(1) from t_test 结果为0
  •       
  • 3. 阻塞线程让线程2执行
  •       
  • 4. 更新表update t_test set AMOUNT = 10 返回执行的行数为1
  •       
  • 5. 读取表select count(1) from t_test 结果为1
  •       
  • 6. 事务结束
  •       


   线程2:
      

          
  • 1. 开启事务
  •       
  • 2. 插入数据 insert into t_test (AMOUNT) values (10)
  •       
  • 3. 事务结束
  •       

分享到:
评论
1 楼 cocoaysj 2016-06-03  
膜拜姆神

相关推荐

    基于Java的网吧管理系统,MySQL数据库,JDBC编程!

    基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java...

    MySQL安装详细教程!!!

    MySQL安装详细教程!!!

    MySQL驱动包-最新!!!!

    MySQL驱动包--最新!!!! MySQL驱动包--最新!!!! MySQL驱动包--最新!!!!

    MySQL可重复读级别能够解决幻读吗

    MySQL的可重复读(Repeatable Read)隔离级别是其事务管理机制的一部分,旨在解决数据库并发操作中的一些问题,如脏读、不可重复读和幻读。然而,标题中提出的问题在于,可重复读隔离级别是否能完全防止幻读。在这个...

    mysql-notes-master.zip

    mysql学习笔记!!!!!!!!!!!!!!!!!!! mysql学习笔记!!!!!!!!!!!!!!!!!!! mysql学习笔记!!!!!!!!!!!!!!!!!!! mysql学习笔记!!!!!!!!!!!!!!!...

    MYSQL数据库大进级,是非常全面的MYSQL数据库进阶学习资料!

    MYSQL数据库大进级,是非常全面的MYSQL数据库进阶学习资料!

    MySQL小面试题!!!!!

    读提交怎么解决幻读问题 WHERE a > 1 and b=1 ORDER BY c 建立索引 如何建立联合索引 比较效率COUNT(1)、COUNT(*)、COUNT(主键)、COUNT(字段) B+树可以并发修改吗 B+树是可以并发修改的。 B+树是MySQL默认的存储...

    详解MySQL是如何解决幻读的

    三、MySQL 是如何解决幻读的 如果你看到了这篇文章,那么我会默认你了解了 脏读 、不可重复读与可重复读。 1. 多版本并发控制(MVCC)(快照读) 多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的...

    mySQL命令大全!!!

    决对好用的。!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    MySql函数详解!!!

    MySQL数据库提供了很多函数包括: 数学函数:数学函数主要用于处理数字,包括整型、浮点数等。 字符串函数:字符串函数是MySQL中最常用的一类函数,字符串函数主要用于处理表中的字符串。 日期和时间函数:MySQL的...

    mysql可重复读和幻读的理解

    串行化级别是最高的隔离级别,它通过强制事务按照序列顺序执行,从而彻底解决了幻读问题,但代价是牺牲了一定的并发性能。 为了进一步理解,我们可以参考《高性能MySQL(第三版)》中的描述,书中将幻读定义为当一...

    非常好用的mysql,下载即可使用!!,谢谢使用

    简洁版的mysql,非常好用,安装就可使用,谢谢使用!

    Mysql 5视图重置密码!忘记Mysql密码工具

    由于需要重置mysql超级管理员root帐号的密码,在网上搜到的那种在命令行使用“mysqld-nt --skip-grant-tables”命令方法的,尝试N次都失败了! 幸好最终发现了这个重置mysql密码的视图操作工具,不能独享,特分享...

    mysql操作文档

    mysql操作文档!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

    MySQL最常用思维导图!!!

    整理:MySQL从创建、数据类型、更新、查询、删除、函数到约束 还有每题都有案例,从头到尾的那种 这个是下载xmind文件,如果不需要,可以查看我发的

    MySql数据库备份与还原!!!

    温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。 2)逻辑备份 对数据库逻辑组件(如:表等数据库对象)的备份 1.以sql语句的形式,把库,表结构,表数据保存下来。 数据库的备份策略 完全备份...

    MySQL面试题经典40问!(全).docx

    有关Mysql之前有单独写过几篇文章•一文详解脏读、不可重复读、幻读•一文详解MySQL的锁机制•手把手教你分析解决MySQL死锁问题•看一遍就懂:MVCC原理详解•MySQL索引经典15问!之所以单独写,是因为这几块内容比较...

    vc++进行连接sql的Demo(类似一个mysql客户端,相当强大!)

    vc++进行连接sql的Demo(类似一个mysql客户端,相当强大!)

Global site tag (gtag.js) - Google Analytics