数据库

事务

数据库连接

  1. 多线程查不到数据的原因

结论

数据库的事务是跟着数据库连接走的,数据库连接又是跟着线程走的,新的线程用的不是同一个连接

问题

一个事务起了一个新的线程, 这个新的线程他是不是查不到这个事务里注入的数据了

锁的原因

同时更新同一大段(一行)数据

场景

一个事务方法下执行大数据量的推送任务. 该方法既可以通过定时任务开始,也可通过手动触发,当两个都在进行,必锁.

<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>

解决方案

  1. 取消事务

    由于该任务是用于推送多个样本结果,报告后给相应的tag打上成功的标记, 所以不用担心整体性的问题

  2. 一条一条的update

    防止同时更新同一部分数据的可能性

新版本已经解决这个问题,每个被同步对象都有关联一个同步记录对象,该对象有同步次数、同步状态,失败原因等。

Powered by Fruition