Java Spring+Hibernate-事务-并发数据库操作
我需要从数据库中读取数据,执行一些逻辑,然后在一个原子操作中将数据写入数据库 我需要确保这个操作是完全线程安全的,因为可以有很多线程使用这个代码 我现在做的是这样的:Java Spring+Hibernate-事务-并发数据库操作,java,multithreading,spring,hibernate,spring-transactions,Java,Multithreading,Spring,Hibernate,Spring Transactions,我需要从数据库中读取数据,执行一些逻辑,然后在一个原子操作中将数据写入数据库 我需要确保这个操作是完全线程安全的,因为可以有很多线程使用这个代码 我现在做的是这样的: @Component @Scope("prototype") public class AccountBalanceChangeHandlerImpl implements AccountBalanceChangeHandler { private final Object mutex = new Object();
@Component
@Scope("prototype")
public class AccountBalanceChangeHandlerImpl implements AccountBalanceChangeHandler {
private final Object mutex = new Object();
@Inject
private UserAccountRepository userAccountRepository;
@Override
public Money handle(Long userAccountId, Money money) throws Exception {
synchronized (mutex) {
UserAccount userAccount = userAccountRepository.findOne(userAccountId);
if (userAccount.getMoney().getCurrencyUnit().equals(money.getCurrencyUnit())) {
userAccount.setMoney(userAccount.getMoney().plus(money));
} else {
BigDecimal currencyRate = getCurrencyConvertRate(money.getCurrencyUnit().getCurrencyCode(),
userAccount.getMoney().getCurrencyUnit().getCurrencyCode());
userAccount.setMoney(userAccount.getMoney().plus(money
.convertedTo(userAccount.getMoney().getCurrencyUnit(), currencyRate, RoundingMode.HALF_UP)));
}
userAccountRepository.save(userAccount);
return userAccount.getMoney();
}
}
private BigDecimal getCurrencyConvertRate(String from, String to) throws Exception {
//something here
}
}
这段代码看起来是线程安全的——我在10到10000个线程上测试了它,但不能让它不工作——在删除同步块后,它失败了
我只是想知道是否有一种方法可以在数据库级别处理它,或者做得更好
我已经阅读了很多关于事务、锁的内容,并在很多方面尝试了@Transactional和@Lock,但我无法让它工作。如果您总是指定具有适当/正确范围的bean,则完全不必担心线程安全。好的,所以我创建了500个bean,有一种方法可以创建这样的新对象,每次帐户更改都要处理它,每个都需要修改数据库中的一列,我怎么能不担心线程安全呢?还是我遗漏了什么?这是另一个与当前问题无关的独立问题。这是为了锁定JPA或其他什么。伙计,你帮不了什么忙。@Tiny你错了,他问的是让数据库操作原子化,而不是java线程安全。也许他没有使用完美准确的词语,但如果你仔细阅读,你就会清楚他在问什么。