结论
数据库的事务是跟着数据库连接走的,数据库连接又是跟着线程走的,新的线程用的不是同一个连接
问题
一个事务起了一个新的线程, 这个新的线程他是不是查不到这个事务里注入的数据了
锁的原因
同时更新同一大段(一行)数据
场景
一个事务方法下执行大数据量的推送任务. 该方法既可以通过定时任务开始,也可通过手动触发,当两个都在进行,必锁.
<update id="updateSyncResultReportStatusBySampleUserIds">
UPDATE
l_sample_user
<set>
sync_report_status = #{status},
<if test="status != null and status != '' and status=='0'">
sample_report_time = null,
last_down_user = null,
last_down_time = null,
report_is_check = null,
report_check_time = null,
report_check_user = null
</if>
</set>
WHERE
sample_user_id IN (SELECT tt FROM regexp_split_to_table( #{sampleUserIds}, E',+' ) AS tt)
</update>
解决方案
取消事务
由于该任务是用于推送多个样本结果,报告后给相应的tag打上成功的标记, 所以不用担心整体性的问题
一条一条的update
防止同时更新同一部分数据的可能性
新版本已经解决这个问题,每个被同步对象都有关联一个同步记录对象,该对象有同步次数、同步状态,失败原因等。