4

私は休止状態のクエリを使用して、Java の下で春のプロジェクトを持っています。悲観的ロックを使用するのが好きです。

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();
}

問題:

メソッドで悲観的ロックを使用したいのですが、このメソッドを別のメソッドから呼び出します。悲観的は、最初のメソッドから呼び出すと正常に動作しますが、2 番目のメソッドから呼び出すと (トランザクションをコミットできませんでした) が返されます

例外:

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

1 に答える 1

3

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);
}
于 2011-08-02T15:09:30.077 に答える