ConcurrentModificationExceptionになったTransactionオブジェクトはrollbackが必要か?また、そのまま再利用はできるのか? #appengine
- ConcurrentModificationExceptionになったTransactionオブジェクトはrollbackは不要
- 再利用は不可、新規にbeginTransactionが必要。
という訳で上記のエントリーのソースにはトランザクション処理に誤りがありました。
Key key;
@Before
public void setup() throws Exception {
Counter e = new Counter();
e.setSeq(new Long(1));
key = Datastore.put(e);
}
@Test
public void トランザクションのテスト() throws Exception {
Transaction tx1 = Datastore.beginTransaction();
Transaction tx2 = Datastore.beginTransaction();
Counter e1 = Datastore.get(tx1, Counter.class, key);
Counter e2 = Datastore.get(tx2, Counter.class, key);
assertThat(e1, is(notNullValue()));
assertThat(e2, is(notNullValue()));
e1.setSeq(e1.getSeq() + 1);
Datastore.put(tx1, e1);
Datastore.commit(tx1);
try {
e2.setSeq(e2.getSeq() + 1);
Datastore.put(tx2, e2);
Datastore.commit(tx2);
} catch (ConcurrentModificationException ignore) {
assertThat(tx2.isActive(), is(false));
Transaction tx3 = Datastore.beginTransaction();
e2 = Datastore.get(tx3, Counter.class, key);
e2.setSeq(e2.getSeq() + 1);
Datastore.put(tx3, e2);
Datastore.commit(tx3);
}
assertThat(e2.getSeq(), is(new Long(3)));
}