diff --git a/src/main/java/com/tailbet/mapper/UserMapper.java b/src/main/java/com/tailbet/mapper/UserMapper.java index 4470730..8af97e4 100644 --- a/src/main/java/com/tailbet/mapper/UserMapper.java +++ b/src/main/java/com/tailbet/mapper/UserMapper.java @@ -3,10 +3,24 @@ package com.tailbet.mapper; import com.tailbet.model.entity.User; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; /** * 用户Mapper */ @Mapper public interface UserMapper extends BaseMapper { + + /** + * 原子增加积分 + */ + @Update("UPDATE user SET points = points + #{amount} WHERE id = #{id}") + int addPoints(@Param("id") Long id, @Param("amount") Long amount); + + /** + * 原子扣除积分(积分不足时返回0) + */ + @Update("UPDATE user SET points = points - #{amount} WHERE id = #{id} AND points >= #{amount}") + int subPoints(@Param("id") Long id, @Param("amount") Long amount); } diff --git a/src/main/java/com/tailbet/service/impl/PointsServiceImpl.java b/src/main/java/com/tailbet/service/impl/PointsServiceImpl.java index e94d517..a7d1bb9 100644 --- a/src/main/java/com/tailbet/service/impl/PointsServiceImpl.java +++ b/src/main/java/com/tailbet/service/impl/PointsServiceImpl.java @@ -35,10 +35,14 @@ public class PointsServiceImpl implements IPointsService { } Long before = user.getPoints(); - Long after = before + amount; - user.setPoints(after); - userMapper.updateById(user); + // 原子增加积分 + int rows = userMapper.addPoints(userId, amount); + if (rows == 0) { + throw new RuntimeException("积分增加失败"); + } + + Long after = before + amount; // 记录流水 PointsFlow flow = new PointsFlow(); @@ -68,10 +72,14 @@ public class PointsServiceImpl implements IPointsService { } Long before = user.getPoints(); - Long after = before - amount; - user.setPoints(after); - userMapper.updateById(user); + // 原子扣除积分(SQL层保证余额充足才扣) + int rows = userMapper.subPoints(userId, amount); + if (rows == 0) { + return false; + } + + Long after = before - amount; // 记录流水 PointsFlow flow = new PointsFlow();