Spring悲观锁 [英] Spring Pessimistic locking
本文介绍了Spring悲观锁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁.
i have spring project under java, using hibernate query, i like to use pessimistic locking.
Spring + Hibernate 如何做悲观锁?
How to do Pessimistic locking in 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();
}
问题:
我想在一个方法中使用悲观锁定,我从不同的方法调用这个方法.当我从第一种方法调用它时悲观工作正常,但是当我从第二种方法调用它时它给出(事务无法提交)
i want to use pessimistic locking in a method, and i call this method from different to methods. pessimistic works fine when i call it from the first method, but it gives (Transaction couldn't be commit) when i call it from the second method
异常:
Could not commit Hibernate transaction; nested exception is org.hibernate.
TransactionException: Transaction not successfully started
推荐答案
http://www.amicabile.com/hybernate/hybernate-chapter5.html
http://javacompleteexamples.blogspot.com/2009/07/how-db-locking-system-works-in.html
试试:
@Override
@Loggable(value = LogLevel.TRACE)
@Transactional
public void updateBalance(String id, BigDecimal amount) {
Account acc = (Account) sessionFactory.getCurrentSession().get(Account.class, id, LockMode.UPGRADE);
acc.setBalance(acc.getBalance().subtract(amount));
save(acc);
}
这篇关于Spring悲观锁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文