JPA:如何正确更新用户存款?

时间:2014-09-06 15:42:37

标签: java jpa transactions

我们的User课程定义如下:

public User{
    // 账户余额 (Account Balance)
    @Column(nullable = false)
    public BigDecimal deposit = new BigDecimal(0);
}

现在我们需要在不同的交易中更新用户的存款,但这是我们遇到问题的地方。例如:

  1. 事务A从数据库中读取deposit = 1000
  2. 事务B从数据库中读取deposit = 1000
  3. 交易B从用户deposit获取200,并将deposit修改为800。
  4. 交易A从用户deposit获取500,并将deposit修改为500。
  5. 交易B写回800。
  6. 交易A写回500。
  7. 在这种情况下,我们的用户实际需要花费700 deposit,并且只剩下300。但最后一个事务将其覆盖为错误的数字。

    我们如何纠正这个?

    我的第一个想法是添加一个@Transient字段来表示我们从数据库中读取的数据,当我们需要更新User时,数据库中的deposit应该与{我们之前分配的{1}}字段。但是如何将@transient映射到现有数据库列(这意味着当我们加载@transient时,User字段应该自动填充)?

1 个答案:

答案 0 :(得分:0)

你正在遇到一个众所周知的问题。

解决它的最简单方法是使用某种锁定,对数据库进行悲观锁定或在应用程序中进行乐观锁定。