PersistenceManager pm = PMF.get().getPersistenceManager(); Transaction tx = null; try { tx = pm.currentTransaction(); tx.begin(); MyData data = new MyData(); data.setName("one"); pm.makePersistent(data); tx.commit(); } finally { if ( tx != null && tx.isActive() ) { tx.rollback(); } if ( pm !=null && ! pm.isClosed()) { pm.close(); }; }
PersistenceManager#currentTransaction で Transaction オブジェクトを取得して、 Transaction#begin でトランザクション開始。
Transaction#commit() でコミット、Transaction#rollback でロールバック。
本当は、rollback 時にも PersistenceManager がクローズされるようにもう一段 try...finally が 必要だけどここは手抜き。
エラー時にロールバックをきちんとしないでトランザクションが Active なまま PersistenceManager をクローズすると、
javax.jdo.JDOUserException: Transaction is still active. You should always close your transactions correctly using commit() or rollback(). FailedObject:org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@9db0e2 at org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:277)
というエラーになる。
最終的には、
com.google.apphosting.utils.servlet.TransactionCleanupFilter handleAbandonedTxns: Request completed without committing or rolling back transaction with id -7895842753490378. Transaction will be rolled back.
と、TransactionCleanupFilter によってロールバックが実行されるようだ。
0 件のコメント:
コメントを投稿