我们的User
课程定义如下:
public User{
// 账户余额 (Account Balance)
@Column(nullable = false)
public BigDecimal deposit = new BigDecimal(0);
}
现在我们需要在不同的交易中更新用户的存款,但这是我们遇到问题的地方。例如:
deposit = 1000
。deposit = 1000
。deposit
获取200,并将deposit
修改为800。deposit
获取500,并将deposit
修改为500。在这种情况下,我们的用户实际需要花费700 deposit
,并且只剩下300。但最后一个事务将其覆盖为错误的数字。
我们如何纠正这个?
我的第一个想法是添加一个@Transient
字段来表示我们从数据库中读取的数据,当我们需要更新User
时,数据库中的deposit
应该与{我们之前分配的{1}}字段。但是如何将@transient
映射到现有数据库列(这意味着当我们加载@transient
时,User
字段应该自动填充)?
答案 0 :(得分:0)
你正在遇到一个众所周知的问题。
解决它的最简单方法是使用某种锁定,对数据库进行悲观锁定或在应用程序中进行乐观锁定。