diff --git a/src/test/java/org/tests/transaction/TestNestedSubTransaction.java b/src/test/java/org/tests/transaction/TestNestedSubTransaction.java index 9b58bd07b..9c99b5f86 100644 --- a/src/test/java/org/tests/transaction/TestNestedSubTransaction.java +++ b/src/test/java/org/tests/transaction/TestNestedSubTransaction.java @@ -5,11 +5,13 @@ import io.ebean.Ebean; import io.ebean.EbeanServer; import io.ebean.PersistenceContextScope; import io.ebean.Transaction; +import io.ebean.TxScope; import org.junit.Test; import org.tests.model.basic.EBasic; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; public class TestNestedSubTransaction extends BaseTestCase { @@ -56,6 +58,114 @@ public class TestNestedSubTransaction extends BaseTestCase { } } + + @Test + public void nestedUseSavepoint_doubleNested_rollbackCommit() { + + EbeanServer server = server(); + + EBasic bean = new EBasic("start2"); + + try (Transaction txn0 = server.beginTransaction()) { + txn0.setRollbackOnly(); + txn0.setNestedUseSavepoint(); + + server.save(bean); + + try (Transaction txn1 = server.beginTransaction()) { + bean.setName("updateNested"); + server.save(bean); + + try (Transaction txn2 = server.beginTransaction()) { + bean.setName("barney"); + Ebean.save(bean); + txn2.commit(); + } + + txn1.rollback(); + } + + EBasic fresh = server.find(EBasic.class) + .setId(bean.getId()) + .setPersistenceContextScope(PersistenceContextScope.QUERY) + .findOne(); + + assertNotNull(fresh); + assertThat(fresh.getName()).isEqualTo("start2"); + } + } + + @Test + public void nestedUseSavepoint_doubleNested_commitRollback() { + + EbeanServer server = server(); + + EBasic bean = new EBasic("start3"); + + try (Transaction txn0 = server.beginTransaction()) { + txn0.setRollbackOnly(); + txn0.setNestedUseSavepoint(); + + server.save(bean); + + try (Transaction txn1 = server.beginTransaction()) { + bean.setName("updateNested3"); + server.save(bean); + + try (Transaction txn2 = server.beginTransaction()) { + bean.setName("barney3"); + Ebean.save(bean); + txn2.rollback(); + } + + txn1.commit(); + } + + EBasic fresh = server.find(EBasic.class) + .setId(bean.getId()) + .setPersistenceContextScope(PersistenceContextScope.QUERY) + .findOne(); + + assertNotNull(fresh); + assertThat(fresh.getName()).isEqualTo("updateNested3"); + } + } + + @Test + public void nestedUseSavepoint_nested_RequiresNew() { + + EbeanServer server = server(); + + EBasic bean = new EBasic("start4"); + + try (Transaction txn0 = server.beginTransaction()) { + txn0.setRollbackOnly(); + txn0.setNestedUseSavepoint(); + + server.save(bean); + + try (Transaction txn1 = server.beginTransaction(TxScope.requiresNew())) { + bean.setName("updateNested4"); + server.save(bean); + txn1.commit(); + } + + EBasic fresh = server.find(EBasic.class) + .setId(bean.getId()) + .setPersistenceContextScope(PersistenceContextScope.QUERY) + .findOne(); + + assertNotNull(fresh); + assertThat(fresh.getName()).isEqualTo("updateNested4"); + } + + EBasic after = server.find(EBasic.class) + .setId(bean.getId()) + .findOne(); + + assertNull(after); + } + @Test public void nestedUseSavepoint() {