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线程安全。也许他没有使用完美准确的词语,但如果你仔细阅读,你就会清楚他在问什么。