【发布时间】:2011-12-27 15:21:09
【问题描述】:
我有java下的spring项目,使用hibernate查询,我喜欢用悲观锁。
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
【问题讨论】:
-
Google“Spring + Hibernate 中的悲观锁定”并获取:docs.jboss.org/hibernate/core/3.3/reference/en/html/…
-
@TomaszNurkiewicz:该链接中没有关于 Spring 的内容。
-
我可以在这里看到一些不好的做法(相当错误) 1)在方法顶部使用@Transactional 同时在方法中打开一个新事务 2)打开一个新会话(
sessionFactory.openSession();while在此之前使用sessionFactory.getCurrentSession()3)关闭当前会话对象。
标签: java database hibernate transactions pessimistic-locking