Hibernateを使っていて
java.lang.IllegalStateException:Transaction already active
というエラーが出てしまった。
Transaction already active とは
Transaction already active とは、文字通り、トランザクションがすでにオープンしているってことですね。
1 2 3 |
java.lang.IllegalStateException: Transaction already active at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74) at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:471) |
Transaction already activeの解決策
1つのトランザクションをオープンして、クローズせずに、あらたなトランザクションをオープンしようとするとこのようなメッセージが出ます。
よく分からない場合は、
transactionがActiveであれば、roolbackするようにします。
1 2 3 4 5 6 7 8 9 10 11 |
// トランザクションの開始 Transaction transaction1 = session.getTransaction(); if (transaction1.isActive()) { try { transaction1.rollback(); } catch (Exception e) { return; } } transaction1 = session.beginTransaction(); |
以下のサイトにも解説があります。
The problem is that when you call entityManager.getTransaction(); a new transaction object will be created. So it is better to save the transaction reference to a variable as shown below.
1 2 3 4 5 6 7 8 9 |
Transaction txn = entityManager.getTransaction(); if (txn.isActive()) { try { txn.rollback(); } catch (PersistenceException | IllegalStateException e) { LOG.error("Transaction rollback failed.", e); } } |
コメント