【数据库】银行转账并发问题

假设账户A的余额是200,B、C分别给A转账100,A自己又消费了50,期望A的余额是350,那么如何做才能确保数据的一致性?

做法1:在代码里加同步锁(推荐)

synchronized (lock) {
    try {
        // 查账户余额
        UserAccount userAccount = userAccountMapper.selectById(userId);

        // 根据业务场景进行数据处理修改(加100或减50)
        userAccount.setBalance(userAccount.getBalance.add(price));

        // 更新账户余额(update)
        userAccountMapper.update(userAccount);
    } catch (Exception e) {
        log.error("error: " + e.getMessage());
    }
}

做法2:数据库悲观锁FOR UPDATE(不推荐,要考虑可能阻塞数据库的问题)

try {
    // 查账户余额 for update
    // SELECT * FROM USER_ACCOUNT WHERE USER_ID = #{userId} FOR UPDATE
    UserAccount userAccount = userAccountMapper.selectById(userId);

    // 根据业务场景进行数据处理修改(加100或减50)
    userAccount.setBalance(userAccount.getBalance.add(price));

    // 更新账户余额(update)
    userAccountMapper.update(userAccount);
} catch (Exception e) {
    log.error("error: " + e.getMessage());
}

做法3:直接写到sql里(推荐)

UPDATE USER_ACCOUNT SET BALANCE = BALANCE + #{amount} WHERE USER_ID = #{userId}

【数据库】数据库事务原理-CSDN博客

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值