diff --git a/src/main/java/com/avaje/ebean/Ebean.java b/src/main/java/com/avaje/ebean/Ebean.java index cc6a42b31..126519503 100644 --- a/src/main/java/com/avaje/ebean/Ebean.java +++ b/src/main/java/com/avaje/ebean/Ebean.java @@ -315,7 +315,10 @@ public final class Ebean { } /** - * Start a new explicit transaction. + * Start a transaction with 'REQUIRED' semantics. + *

+ * With REQUIRED semantics if an active transaction already exists that transaction will be used. + *

*

* The transaction is stored in a ThreadLocal variable and typically you only * need to use the returned Transaction IF you wish to do things like diff --git a/src/main/java/com/avaje/ebean/EbeanServer.java b/src/main/java/com/avaje/ebean/EbeanServer.java index ba0cbd8b5..e372ebe9b 100644 --- a/src/main/java/com/avaje/ebean/EbeanServer.java +++ b/src/main/java/com/avaje/ebean/EbeanServer.java @@ -509,7 +509,10 @@ public interface EbeanServer { Transaction createTransaction(TxIsolation isolation); /** - * Start a new explicit transaction putting it into a ThreadLocal. + * Start a transaction with 'REQUIRED' semantics. + *

+ * With REQUIRED semantics if an active transaction already exists that transaction will be used. + *

*

* The transaction is stored in a ThreadLocal variable and typically you only * need to use the returned Transaction IF you wish to do things like diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index e0b1ca6e9..b6ea67a9b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -756,16 +756,16 @@ public final class DefaultServer implements SpiEbeanServer { } /** - * Start a transaction. + * Start a transaction with 'REQUIRED' semantics. + *

+ * If a transaction already exists that transaction will be used. + *

*

* Note that the transaction is stored in a ThreadLocal variable. *

*/ public Transaction beginTransaction() { - // start an explicit transaction - SpiTransaction t = transactionManager.createTransaction(true, -1); - transactionScopeManager.set(t); - return t; + return beginTransaction(TxScope.required()); } public Transaction beginTransaction(TxScope scope) { diff --git a/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java b/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java index e6277344e..77ba1bc93 100644 --- a/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java +++ b/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java @@ -32,6 +32,9 @@ public class TestExplicitInsert extends BaseTestCase { Assert.assertNotNull(b.getId()); + Assert.assertEquals(b.getId(), server.getBeanId(b)); + + EBasic b2 = server.find(EBasic.class, b.getId()); b2.setId(null); diff --git a/src/test/java/com/avaje/tests/basic/event/TestTransactionEvent.java b/src/test/java/com/avaje/tests/basic/event/TestTransactionEvent.java index f502bd706..6a36c862e 100644 --- a/src/test/java/com/avaje/tests/basic/event/TestTransactionEvent.java +++ b/src/test/java/com/avaje/tests/basic/event/TestTransactionEvent.java @@ -35,7 +35,6 @@ public class TestTransactionEvent extends TestCase { tx.commit(); assertNotNull(MyTestTransactionEventListener.getLastCommitted()); - assertSame(MyTestTransactionEventListener.getLastCommitted(), tx); assertNotNull(MyTestTransactionEventListener.getLastCommitted().getUserObject("myUserObject")); assertSame(MyTestTransactionEventListener.getLastCommitted().getUserObject("myUserObject"), myUserObject); assertNull(MyTestTransactionEventListener.getLastRollbacked()); @@ -54,11 +53,9 @@ public class TestTransactionEvent extends TestCase { assertNotSame(MyTestTransactionEventListener.getLastCommitted(), MyTestTransactionEventListener.getLastRollbacked()); - assertSame(MyTestTransactionEventListener.getLastCommitted(), tx); assertNotNull(MyTestTransactionEventListener.getLastCommitted().getUserObject("myUserObject")); assertSame(MyTestTransactionEventListener.getLastCommitted().getUserObject("myUserObject"), myUserObject); - - assertSame(MyTestTransactionEventListener.getLastRollbacked(), tx2); + assertNotNull(MyTestTransactionEventListener.getLastRollbacked().getUserObject("myUserObject2")); assertSame(MyTestTransactionEventListener.getLastRollbacked().getUserObject("myUserObject2"), myUserObject); } diff --git a/src/test/java/com/avaje/tests/transaction/TestCreateTransactionWithIsolation.java b/src/test/java/com/avaje/tests/transaction/TestCreateTransactionWithIsolation.java new file mode 100644 index 000000000..b69d01f41 --- /dev/null +++ b/src/test/java/com/avaje/tests/transaction/TestCreateTransactionWithIsolation.java @@ -0,0 +1,17 @@ +package com.avaje.tests.transaction; + +import com.avaje.ebean.*; +import org.junit.Test; + +public class TestCreateTransactionWithIsolation extends BaseTestCase { + + @Test + public void test() { + + EbeanServer server = Ebean.getServer(null); + Transaction txn = server.createTransaction(TxIsolation.SERIALIZABLE); + txn.end(); + + } + +}