问题
l-hoteldb11.h.cn6:3307/zyj_msg, 对于刚写入的数据,查询不到结果
transaction_isolation = REPEATABLE-READ
详情
- 先执行数据更新和插入语句, 如下:
SET autocommit=0 UPDATE full_zyj_wrapper_log SET feedBack='1',checktime=1427203789488 WHERE hotelSeq='guangzhou_9930' AND codeBase='wiqunarqta2' AND roomID='471701_127488' AND fromDate='2015-03-28' INSERT INTO exclude_monitor (codeBase, hotelSeq, roomID, roomName, checkInDate, checkTime, expireTime, status, updateTime) VALUES ('wiqunarqta2','guangzhou_9930','471701_127488','豪华单人间(预留房1 8:00过时自动关房无效)-豪华单','2015-03-28',1427203789488,1427290189488,'0',(UNIX_TIMESTAMP()+1)*1000) on duplicate key update checkTime=values(`checkTime`),roomName=values(`roomName`),status=values(`status`),expireTime=values(`ex pireTime`),updateTime=((UNIX_TIMESTAMP()+1)*1000) commit
- 然后过10秒左右去查询, 如下:
SELECT id,codeBase,hotelSeq,roomID,roomName,checkInDate,checkTime,expireTime,status FROM exclude_monitor WHERE updateTime>=1427203770091 and updateTime<1427203780091
- 程序查不到结果, 但是手动去数据库查就能查到结果
排查
- 怀疑是事务顺序问题
- 怀疑是语句执行超时问题
- 打印取出内容
- 打印当前的事务状态 show variables like 'autocommit'; ,最终定位问题
总结
对于此类问题, 刚开始的时候怀疑SELECT语句包含在事务中,执行了类似下面的逻辑
- 线程1, 拿到一个数据库连接, 开启一个事务(autocommit=0), 执行任务,未提交, 就将线程归还到线程池
- 线程2, 拿到另一个数据库连接, 开启一个事务, 执行任务, 即INSERT操作,提交后, 将线程归还到线程池
- 线程3, 拿到线程1用过的连接, 因为这个事务未提交, 而且是在INSERT之前开启的事务, 所以它来执行查询, 查不到线程2所插入的数据
排查过程中, 开发一直肯定, 语句的事务提交了, SELECT中没有事务, 在此, 用下面这句话"劝说"比较合适
shuai.lou(娄帅) 03-25 15:05:54
一定不要相信自己写的代码和所谓的框架