假设我在一个银行领域工作,我有三个客户,分别是A、B、C。Balance of A= Rs.100 Balance of B= Rs.0 Balance of C=Rs.100
现在A和C都在同时向B汇款。增加余额的代码并发运行。当A向B汇款时,会调用DB来获取其当前余额,即Rs.0,同时C向B发送资金,并调用DB,DB也会将当前余额返回为Rs.0。
因此,当控制从数据库"A“返回,钱被添加到B的帐户,它将是Balance=Current Balance+ Money Received So balance= 100。同样,当控制从数据库"C“返回时,余额= Rs.100,因为此请求获取的当前余额也是Rs.0。
如何处理这样的场景?
发布于 2021-11-25 13:20:25
一个简单的UPDATE account SET balance=balance+100 WHERE userId = ?将确保即使在并发场景中,余额也会适当增加。
只有在Java代码中检索余额以增加余额时,才需要采取特殊的预防措施,但这将是更复杂的解决方案。
发布于 2021-11-25 12:56:00
首先,通过将其实现到send方法中来实现并发。因此,在您的示例中没有什么需要实现的,因为已经有一个并发设置。如果发送命令进入流水线并被一个接一个地处理,那么它将不是并发的。
您遇到的问题是对数据库的脏写/脏读,因此需要一个transaction isolation。通常,数据库会检查这种情况,并锁定要写入的行。从理论上讲,当数据库提供事务时,您可以信任数据库。这将是一种糟糕的做法,没有必要重复检查这一点。如果不是这样,您应该实现锁(由于密集的锁,这可能会导致性能问题),并同步对客户帐户的访问。
要进行同步,可以使用addBalance方法:
synchronized void addBalance(int amount, CustomerAccountEntity customer) {
//getCustomerBalance
balance = balance+amount;
}https://stackoverflow.com/questions/70111276
复制相似问题