mycat引起的insert后马上select不到数据的故障分析
由于有2个task表t_task和e_task,代码中Insert了t_task后马上select t_task然后把结果Insert到e_task,结果发现经常e_task会没有任何数据。
原因分析:使用mycat后读写分离,select语句会去从库读取t_task,这个时候很可能从库还没有把主库的t_task同步到e_task,导致查询不出来t_task所以e_task也没有插入。
所以对于这种毫秒级的insert后马上查询,可以用如下的语句保证select语句走mycat的主库,解决这个bug
<select id="selectOneTaskByCode" resultMap="BaseResultMap">
/*#mycat:db_type=master*/ select * from t_task where task_code=#{taskCode}
</select>
以上是网络转载,自己碰到类似的情况,插入之后再select就是取不到。不是每次出现,但是会有至少20%的概率。
开始以为是insert需要加事务,但在单机数据库上反复测试,怎么都正常。这才想到会不会是mycat的问题。
果然网络上查到,先备份此份内容,按此修改,后续再看结果。