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

假设账户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博客

相关推荐

  1. 数据库银行转账并发问题

    2024-05-15 15:32:15       35 阅读
  2. 银行的金额大小写转换

    2024-05-15 15:32:15       47 阅读
  3. 将图片数据转换为张量(Go并发处理)

    2024-05-15 15:32:15       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-15 15:32:15       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-15 15:32:15       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-15 15:32:15       87 阅读
  4. Python语言-面向对象

    2024-05-15 15:32:15       96 阅读

热门阅读

  1. 学习MySQL(一):了解数据库

    2024-05-15 15:32:15       34 阅读
  2. Flink中基于Chandy-Lamport算法的分布式快照实现详解

    2024-05-15 15:32:15       37 阅读
  3. Qt中的TCP通信:一个详细指南

    2024-05-15 15:32:15       35 阅读
  4. LeetCode1523.在区间范围内统计奇数数目

    2024-05-15 15:32:15       36 阅读
  5. 桥接模式

    2024-05-15 15:32:15       31 阅读
  6. 5.14号模拟前端面试10问

    2024-05-15 15:32:15       31 阅读
  7. Python实战

    2024-05-15 15:32:15       36 阅读
  8. Hive内部表(管理表)和外部表的区别

    2024-05-15 15:32:15       33 阅读
  9. Intel RealSense D455深度相机驱动安装与运行

    2024-05-15 15:32:15       37 阅读
  10. 配置多个SSH密钥以访问不同平台(GitHub、Gitee)

    2024-05-15 15:32:15       37 阅读