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

atfakris 2017-03-19 09:30:23
各位高手,现遇一奇怪问题,请教一下:

背景如图:


一台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不同线程之间数据是不同步的?那如果一个连接持续了数个小时,那查询到的数据岂不是数个小时之前的数据了?绝对不会这样吧?

请教一下各位:
上面的问题是什么原因?应该怎么样避免和解决呢?谢谢。


...全文
170 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
atfakris 2017-03-22
  • 打赏
  • 举报
回复
谢谢楼上各位,试运行了两天暂无报告说类似情况,已经结贴。
slwang001 2017-03-21
  • 打赏
  • 举报
回复
请查看隔离级别的描述 mysql默认的隔离界别为:Repeatable Read 也就是一个事务中,读取到的数据是不变的。即使其他线程对这条数据修改了,读取到的还是未修改时的值。
zjcxc 2017-03-21
  • 打赏
  • 举报
回复
commit/rollback 都行,主要就是消除当前连接的事务,如果你的连接只是用来做查询的,那么肯定不会有丢失数据 至于 另外一种改事务隔离组播方法也是可以避免重复读的问题的,因为默认的隔离级别是可以重复读(也就是事务中的多次读取保证结果一样,不体现数据变化,这个是默认的隔离级别),而用 read committed,则不保证事务中的多次读取一样,有变化的数据会体现出来
atfakris 2017-03-21
  • 打赏
  • 举报
回复
引用 7 楼 zjcxc 的回复:
和之前的这个问题类似 http://bbs.csdn.net/topics/392092739
谢谢,你上一条回复中建议我在查询语句前加个 rollback; 语句,我在想这样会不会有丢失数据的风险呢?可否换成在查询语句前加个 commit; 语句? 看到这个帖子里面您的建议后,我在获取到connection后增加了下面一条语句: conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 先测试几天,您觉得这条语句会产生效果么? 谢谢您。
atfakris 2017-03-21
  • 打赏
  • 举报
回复
引用 6 楼 zjcxc 的回复:
你试试在管理端,查询语句前加个 rollback; 语句,如果这种情况下查询没问题,那就是事务的问题了
好的,我这就尝试一下。
zjcxc 2017-03-21
  • 打赏
  • 举报
回复
和之前的这个问题类似 http://bbs.csdn.net/topics/392092739
zjcxc 2017-03-21
  • 打赏
  • 举报
回复
你试试在管理端,查询语句前加个 rollback; 语句,如果这种情况下查询没问题,那就是事务的问题了
atfakris 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
mysql不同事务之间的数据肯定是隔离开的 互相看不见的
查询的代码不会加conn.setAutocommit(false)这样的代码啊,怎么会在查询的地方打开事务呢?
atfakris 2017-03-20
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
这个问题前几天才有人提过类似的 这种情况应该是管理员的查询端开了事务导致,在同一个事务中的多次查询,数据是一致的,也就是看不到数据变化
我狂搜一圈没搜到啊,您有映像没?可否帮我找找当时那篇帖子?我去看看那篇下面的回答。谢谢。
rucypli 2017-03-20
  • 打赏
  • 举报
回复
mysql不同事务之间的数据肯定是隔离开的 互相看不见的
zjcxc 2017-03-20
  • 打赏
  • 举报
回复
这个问题前几天才有人提过类似的 这种情况应该是管理员的查询端开了事务导致,在同一个事务中的多次查询,数据是一致的,也就是看不到数据变化
atfakris 2017-03-20
  • 打赏
  • 举报
回复
自己悄悄顶起来,请高手再看看,谢谢。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧