比如我们某个时间段要给用户发奖金,肯定要先写日志,再给用户加钱,但是有时间如果同时给一个用户发奖金,可能会引发并发带来数据不一致的问题,甚至说写了多条相同的日志
先来一个防止数据插入重复的sql ,dual 是系统自动的表,后面3个参数是不允许重复的条件
INSERT into amount_date(admin_id,amount,actual_amount,discount_amount,add_time,`date`,commission,`name`,`type`)
(SELECT #{admin_id},#{amount},#{actual_amount},#{discount_amount},#{add_time},#{date},#{commission},#{name},#{type}
FROM DUAL
WHERE NOT EXISTS(SELECT admin_id
from amount_date
where admin_id = #{admin_id}
and `date` = #{date}
and `type` = #{type}))
再来一个防止数据并发修改,数据不一致的问题,那就是行级锁,查询日记表里面的钱复制到用户钱包字段,在修改用户钱包的时候
通过for update 把这条数据加锁
UPDATE user a,
(SELECT u.id,u.user_money,c.user_money as c_user_money from user u,
(SELECT user_money,user_id FROM account_log WHERE log_id = #{log_id})c
where u.id = c.user_id for update)b
set a.user_money = b.user_money + b.c_user_money
where a.id = b.id
多表查询,不要直接去关联两个表,应该用结果集去关联另外一个表