Spring悲观锁

4
我有一个使用Hibernate查询的Java Spring项目,我想要使用悲观锁定。
如何在Spring + Hibernate中实现悲观锁定? 编辑:
@Loggable(value = LogLevel.TRACE)
@Transactional
@Override
public void updateBalance(String id, BigDecimal amount) {
    Session session = sessionFactory.getCurrentSession();
    sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.flush();
    Account acc = (Account) session.get(Account.class, id, LockMode.UPGRADE);
    acc.setName("New Account");
    acc.setBalance(acc.getBalance().subtract(amount));
    save(acc);
    try{
        tx.commit();
    }catch (TransactionException e){
        tx.rollback();
    }
    session.close();
}

问题:

我想在一个方法中使用悲观锁,并且我从不同的方法中调用此方法。当我从第一个方法中调用它时,悲观锁可以正常工作,但是当我从第二个方法中调用它时,它会出现(事务无法提交)的错误。

异常:

Could not commit Hibernate transaction; nested exception is org.hibernate.
TransactionException: Transaction not successfully started

5
请访问Google搜索“Spring和Hibernate中的悲观锁定”,并打开以下链接以获取更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking - Tomasz Nurkiewicz
1
@TomaszNurkiewicz:那个链接里面没有关于_Spring_的内容。 - Greg Kopff
1
我可以看到这里有一些不好的做法(或者说错误):1)在方法中同时打开一个新的事务,并在方法上方使用 @Transactional。2)在使用 sessionFactory.getCurrentSession() 之前,打开一个新的 Session(sessionFactory.openSession();)。3)关闭当前的 Session 对象。 - Arun Kumar
1个回答

3

我想在一个方法中使用悲观锁,并且我从不同的方法中调用这个方法。我阅读了这些链接,解决了问题。但是又出现了另一个问题,当我从第二个方法中调用它时,悲观锁在第一个方法中运行良好,但会出现“无法提交事务”的错误。 - user597987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接