首页 > 数据库 >[Mysql] 网站查询数据不是最新的数据

[Mysql] 网站查询数据不是最新的数据

时间:2023-11-25 16:32:47浏览次数:43  
标签:事务 隔离 READ 级别 查询 提交 Mysql 数据

一、发现问题

近期部署一个内部服务站点,提供一个web界面供查询和展示分析后的数据报表,启动时一段时间内数据查询获取的都是最新值,等待几个小时后,网页查询出来的结果不是最新值,但是数据库中是存在更新的数据记录,不知何故?

二、排查过程

在MySQL中事务的隔离级别有4种类型:

  1. 读未提交(READ UNCOMMITTED)
  2. 读已提交(READ COMMITTED)
  3. 可重复读(REPEATABLE READ)
  4. 序列化(SERIALIZABLE)

MySQL 默认的事务隔离级别是可重复读(REPEATABLE READ),这 4 种隔离级别的说明如下。

1.READ UNCOMMITTED

读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

2.READ COMMITTED

读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。

3.REPEATABLE READ

可重复读,是 MySQL 的默认事务隔离级别,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read)。

4.SERIALIZABLE

序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

因为默认MySQL设置的是REPEATABLE READ,所以存在重复读的情况,为解决此问题,需要采用commit(),原因在于:

MySQL如果直接select,默认是自动commit,但是采用pymysql是默认开启事务(需要手动commit),为了每次都能读取到最新的更新,需要commit,如果需要在事务内重复度,则不需要commit,这与隔离级别有关。

[Mysql] 网站查询数据不是最新的数据_MySQL

三、解决方案

try:
    cursor.execute("select u_time,ip from u_data where datediff(now(),u_time)<1 order by u_time desc;")

    conn.commit()
except:
    conn.rollback()

标签:事务,隔离,READ,级别,查询,提交,Mysql,数据
From: https://blog.51cto.com/ciscoskys/8561393

相关文章

  • C语言自定义数据类型-结构体
    在讨论自定义数据类型之前,我们不妨先回忆一下C语言的内置类型。例如字符型的char,整型中的intshortlong以及浮点型的floatdouble,这些都会C语言本身提供的数据类型,但仅仅有这些,是不足以满足我们的开发的。那么也就意味着需要一些复杂类型来帮助我们实现对复杂对象的操作,例如结构......
  • Python:数据类型与操作,变量与函数
    数据类型1.整数Integer(int)2.浮点数Float(默认双精度)3.布尔值Boolean(bool)4.类型Typeprint(type(2))<class'int'>`print(type(2<2.2))<class'bool'>print(type(type(2)))<class'type'>常数1.python内置常量Ture,用于表示布尔真False......
  • 迁移Docker镜像与数据保存位置
    需求使用Arm开发板跑Docker系统自代的/目录只有8G空间无法满足拉取大镜像的需求,需要将Dokcer镜像与数据单独保存再外部磁盘。实现可以通过手动修改配置文件实现。停止Docker服务sudoservicedockerstop编辑/etc/docker/daemon.json添加如下字段{"data-root":"/path......
  • PHP将数据表里的两个字段映射成对象的键和值
    $playersArray=DB::table('sign_up') ->select('user_id','nickname') ->where('order_id','=',$request->id) ->where('nickname','<>','') ->get() -&g......
  • 神通数据库备份恢复过程之二
    神通数据库备份恢复过程之二背景前期总结过神通数据库的备份,但是发现这两边在进行备份呢时效率非常地下因为虚拟机有快照并且是raid6的hdd读写性能非常感人数据库也大约有了100G以上今天就进行一下脚本的更新,提高备份呢的效率学习来源:https://www.jianshu.com/......
  • 第九单元 连接查询
     请问上图中显示的数据是一张表中的吗?1.连接查询的分类内连接外连接(左外连接,右外连接,全连接)自连接交差连接(不讲)2.内连接注意:Join与innerjoin等效(默认为内连接)语法格式:select字段列表from表1innerjoin表2on表1.外键=表2.外键内连接:会把两......
  • MySQL 从库变主库
    从库变主库一.在从库主机上:1.确认同步完成showslavestatus\G2.停止从库stopslave;#清空从库relaylog日志resetslave;#清除slave信息resetslaveall;查看是否清除showslavestatus\G3.清除binlogresetmaster;4从变主后,配置文件开启binlogid号别错了5.从库要重......
  • C/C++ 运用Npcap发送UDP数据包
    Npcap是一个功能强大的开源网络抓包库,它是WinPcap的一个分支,并提供了一些增强和改进。特别适用于在Windows环境下进行网络流量捕获和分析。除了支持通常的网络抓包功能外,Npcap还提供了对数据包的拼合与构造,使其成为实现UDP数据包发包的理想选择。本章将通过Npcap库构造一......
  • 一个用于多线程共享数据保护测试的简易游戏服务器代码
    #include<iostream>#include<thread>#include<list>#include<mutex>//一个线程负责从客户端读取用户的命令,放入一个队列中;//另一个线程负责从队列中读取命令并解析,假设用一个int变量代表一个命令。classA{public://这里无法模拟从网络接受命令的过程,我们......
  • MySQL Group by 优化查询
     translatorAfrikaansAlbanian-shqipeArabic-‎‫العربية‬‎Armenian-ՀայերէնAzerbaijani-azərbaycancaBasque-euskaraBelarusian-беларускаяBengali-বাংলাBulgarian-българскиCatalan-catalàChi......