#1421 - Nested programatic transaction using auto close / try with resources ... does not end/rollback the parent/outer transaction

This commit is contained in:
rob bygrave
2018-06-13 22:22:29 +12:00
parent e683e25a95
commit c088cfa339
2 changed files with 244 additions and 2 deletions
@@ -0,0 +1,238 @@
package org.tests.transaction;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Transaction;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tests.model.basic.EBasic;
import static org.assertj.core.api.Assertions.assertThat;
public class TestNestedTransaction extends BaseTestCase {
private static final Logger log = LoggerFactory.getLogger(TestNestedTransaction.class);
private EBasic bean;
@Before
public void init() {
bean = new EBasic("new");
Ebean.save(bean);
}
private void assertClean() {
EBasic myBean = Ebean.find(EBasic.class, bean.getId());
assertThat(myBean.getName()).isEqualTo("new");
}
private void assertModified() {
EBasic myBean = Ebean.find(EBasic.class, bean.getId());
assertThat(myBean.getName()).isEqualTo("modified");
}
private void modify() {
bean.setName("modified");
Ebean.save(bean);
}
// ===== level 0 =======
@Test
public void testNested_0() {
try (Transaction txn0 = Ebean.beginTransaction()) {
modify();
// no commit
}
assertClean();
}
@Test
public void testNested_1() {
try (Transaction txn0 = Ebean.beginTransaction()) {
modify();
txn0.commit();
}
assertModified();
}
// ===== level 1 =======
@Test
public void testNested_00() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
modify();
// no commit
}
// no commit
}
assertClean();
}
@Test
public void testNested_01() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
modify();
// no commit
}
attemptCommit(txn0);
}
assertClean();
}
private void attemptCommit(Transaction txn) {
try {
txn.commit();
} catch (IllegalStateException e) {
// expected
log.info("Expected IllegalStateException as transaction already rolled back " + e.getMessage());
}
}
@Test
public void testNested_10() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
modify();
txn1.commit();
}
// no commit
}
assertClean();
}
@Test
public void testNested_11() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
modify();
txn1.commit();
}
txn0.commit();
}
assertModified();
}
// ===== level 2 =======
@Test
public void testNested_000() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
// no commit
}
// no commit
}
// no commit
}
assertClean();
}
@Test
public void testNested_001() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
// no commit
}
// no commit
}
attemptCommit(txn0);
}
assertClean();
}
@Test
public void testNested_010() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
// no commit
}
txn1.commit();
}
// no commit
}
assertClean();
}
@Test
public void testNested_011() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
// no commit
}
txn1.commit();
}
attemptCommit(txn0);
}
assertClean();
}
@Test
public void testNested_100() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
txn2.commit();
}
// no commit
}
// no commit
}
assertClean();
}
@Test
public void testNested_101() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
txn2.commit();
}
// no commit
}
attemptCommit(txn0);
}
assertClean();
}
@Test
public void testNested_110() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
txn2.commit();
}
txn1.commit();
}
// no commit
}
assertClean();
}
@Test
public void testNested_111() {
try (Transaction txn0 = Ebean.beginTransaction()) {
try (Transaction txn1 = Ebean.beginTransaction()) {
try (Transaction txn2 = Ebean.beginTransaction()) {
modify();
txn2.commit();
}
txn1.commit();
}
txn0.commit();
}
assertModified();
}
}