【发布时间】:2017-07-20 07:00:22
【问题描述】:
我有这样的代码:
@Transactional(rollbackOn = RuntimeException.class)
synchronized public void transfer(@NonNull final TransferModel transferModel) {
log.info("Start processing money transfer from user: {} to receiver: {}. Transfer amount: {}", transferModel.getOwnerId(), transferModel
.getReceiverId(), transferModel.getAmount());
final AccountEntity ownerAccount = findByOwner(transferModel.getOwnerId());
final AccountEntity receiverAccount = findByOwner(transferModel.getReceiverId());
log.info("Owner balancer before transfer: {}. Receiver balance before transfer {}", ownerAccount.getBalance(), receiverAccount.getBalance());
if (ownerAccount.getBalance().compareTo(transferModel.getAmount()) < 0) {
throw new IllegalArgumentException("Owner has insufficient amount of money");
}
withdrawFromOwnerAccount(ownerAccount, transferModel.getAmount());
depositToReceiverAccount(receiverAccount, transferModel.getAmount());
log.info("Transfer money finished successful");
log.info("Owner balancer after transfer: {}. Receiver balance after transfer {}", ownerAccount.getBalance(), receiverAccount.getBalance());
}
简单的方法,从所有者那里获取金钱并传递给接收者。这种解决方案很幼稚,因为它一次不能处理多个传输。如何确保此方法可以处理多个请求并在并发环境中安全?
【问题讨论】:
-
方法不能处理多个请求。方法被调用。在您的情况下,由于方法是同步的,这会按顺序发生。正如我们对您的环境的确切了解零 - 应该如何理解当您并行执行此方法时究竟会发生什么?抱歉,这个问题太笼统了。
标签: java concurrency transactions synchronized