Code Bye

MySQL单库也会存在线程见数据不同步的情况吗

各位高手,现遇一奇怪问题,讨教一下:
背景如图:

一台mysql,timeout设为120秒。
两台tomcat,分别给用户和管理员提供web服务。
两台tomcat服务器连接池配置参数是一样的:
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" validationQuery="SELECT 1"
testOnBorrow = "true" testWhileIdle = "true" timeBetweenEvictionRunsMillis = "30000"
minEvictableIdleTimeMillis = "1800000" numTestsPerEvictionRun="3"
maxIdle="90" maxActive="100" minIdle="10" initialSize="10"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"

遇到的问题:
用户下单后,管理员收到了邮件,但是根据邮件中的订单号在管理页面上搜不到信息,告诉本人,几个小时后,本人有时间登录后台管理页面查询,的确查不到数据,于是直接从本人的电脑上用HeiDiSQL连接到mysql,查询订单号发现数据库里面是有数据的。于是重启了tomcat2,也就是管理后台的tomcat,再次通过管理页面查询,订单信息就能查出来了。
本人的分析:
1、曾经怀疑过是tomcat1在保存这个订单时遇到锁,tomcat2查询时就没有查出来。但是这样的情况重启tomcat2也应该没用啊,而且本人直接登录到数据库,发现数据是存在的,因此排除了锁的问题。
2、由于重启了tomcat2就能解决问题,分析重启这个动作的本质,就是断开tomcat2到mysql的全部线程,重新建立新的连接。
3、假如分析2成立,那么就意味着mysql不同线程之间数据是不同步的?那假如一个连接持续了数个小时,那查询到的数据岂不是数个小时之前的数据了?绝对不会这样吧?
讨教一下各位:
上面的问题是什么原因?应该怎样避免和解决呢?谢谢。

解决方案

30

commit/rollback 都行,主要就是消除当前连接的事务,假如你的连接只是用来做查询的,那么肯定不会有丢失数据
至于 另外一种改事务隔离组播方法也是可以避免重复读的问题的,原因是默认的隔离级别是可以重复读(也就是事务中的多次读取保证结果一样,不体现数据变化,这个是默认的隔离级别),而用 read committed,则不保证事务中的多次读取一样,有变化的数据会体现出来

10

请查看隔离级别的描述
mysql默认的隔离界别为:Repeatable Read
也就是一个事务中,读取到的数据是不变的。即使其他线程对这条数据修改了,读取到的还是未修改时的值。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MySQL单库也会存在线程见数据不同步的情况吗