You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2018/01/04 20:46:26 UTC

[12/14] jena git commit: JENA-1458: Update Txn

JENA-1458: Update Txn


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/87ab2a7b
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/87ab2a7b
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/87ab2a7b

Branch: refs/heads/master
Commit: 87ab2a7b32ae587c95e9e9262184715d413f3a89
Parents: 1d48cea
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Jan 2 22:50:43 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Jan 2 22:50:43 2018 +0000

----------------------------------------------------------------------
 .../jena/sparql/core/TransactionalLock.java     |  17 ++-
 .../main/java/org/apache/jena/system/Txn.java   | 127 ++++++++++++-------
 .../apache/jena/system/TestTxnLifecycle.java    |  21 +++
 jena-cmds/src/main/java/tdb2/tdbdump.java       |   2 +-
 jena-cmds/src/main/java/tdb2/tdbstats.java      |   2 +-
 .../java/org/apache/jena/dboe/jenax/Txn.java    |  42 ------
 .../dboe/trans/bplustree/TestBPlusTreeTxn.java  |   2 +-
 .../trans/data/TestTransBinaryDataFile.java     |   2 +-
 .../jena/dboe/trans/data/TestTransBlob.java     |   2 +-
 .../trans/data/TestTransBlobPersistent.java     |   2 +-
 .../transaction/TestThreadingTransactions.java  |   2 +-
 .../TestTransactionCoordinatorControl.java      |   2 +-
 .../jena/dboe/transaction/TestTxnLib.java       |   2 +-
 .../jena/dboe/transaction/TestTxnLib2.java      |   2 +-
 .../jena/dboe/transaction/TestTxnSwitching.java |   2 +-
 .../org/apache/jena/tdb2/loader/Loader.java     |   2 +-
 .../java/org/apache/jena/tdb2/sys/CopyDSG.java  |   2 +-
 .../org/apache/jena/tdb2/sys/DatabaseOps.java   |   2 +-
 .../org/apache/jena/tdb2/TestDatabaseMgr.java   |   2 +-
 .../org/apache/jena/tdb2/TestTDBFactory.java    |   2 +-
 .../apache/jena/tdb2/graph/TestGraphsTDB2.java  |   2 +-
 .../apache/jena/tdb2/junit/QueryTestTDB.java    |   2 +-
 .../org/apache/jena/tdb2/solver/TestStats.java  |   2 +-
 .../AbstractTestStoreConnectionBasics.java      |   2 +-
 .../jena/tdb2/store/TestTransactions.java       |   2 +-
 .../apache/jena/tdb2/store/Test_SPARQL_TDB.java |   2 +-
 .../apache/jena/tdb2/sys/TestDatabaseOps.java   |   2 +-
 .../jena/query/text/DatasetGraphText.java       |  12 ++
 28 files changed, 151 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
index 14d04b8..7086403 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
@@ -65,8 +65,8 @@ public class TransactionalLock implements Transactional {
     @Override public boolean supportsTransactionAbort() { return false; }
  */
     
-    private ThreadLocal<Boolean> inTransaction = ThreadLocal.withInitial(() -> Boolean.FALSE);
-    private ThreadLocal<TxnType> txnType = ThreadLocal.withInitial(() -> null);
+    private ThreadLocal<Boolean>   inTransaction = ThreadLocal.withInitial(() -> Boolean.FALSE);
+    private ThreadLocal<TxnType>   txnType = ThreadLocal.withInitial(() -> null);
     private ThreadLocal<ReadWrite> txnMode = ThreadLocal.withInitial(() -> null);
     private final Lock lock ;
 
@@ -112,7 +112,9 @@ public class TransactionalLock implements Transactional {
         ReadWrite readWrite = TxnType.convert(txnType);  
         boolean isRead = readWrite.equals(ReadWrite.READ) ;
         lock.enterCriticalSection(isRead);
-        txnMode.set(readWrite);
+        this.inTransaction.set(true);
+        this.txnMode.set(readWrite);
+        this.txnType.set(txnType);
     }
 
     @Override public ReadWrite transactionMode() {
@@ -144,10 +146,12 @@ public class TransactionalLock implements Transactional {
 
     @Override
     public boolean isInTransaction() {
-        return txnMode.get() != null ;
+        return inTransaction.get();
     }
 
     public boolean isTransactionType(ReadWrite mode) {
+        if ( ! isInTransaction() )
+            return false;
         return Lib.readThreadLocal(txnMode) == mode;
     }
 
@@ -161,7 +165,12 @@ public class TransactionalLock implements Transactional {
     private void endOnce() {
         if ( isInTransaction() ) {
             lock.leaveCriticalSection() ;
+            txnMode.set(null);
+            txnType.set(null);
+            inTransaction.set(false);
             txnMode.remove();
+            txnType.remove();
+            inTransaction.remove();
         }
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/Txn.java b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
index 69ad6c6..a0ad64f 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/Txn.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
@@ -20,54 +20,64 @@ package org.apache.jena.system;
 
 import java.util.function.Supplier ;
 
-import org.apache.jena.query.ReadWrite ;
+import org.apache.jena.query.TxnType;
+import org.apache.jena.sparql.JenaTransactionException;
 import org.apache.jena.sparql.core.Transactional ;
 
-/** Application utilities for transactions.
- *  <ul> 
- *  <li>"Autocommit" provided. 
- *  <li>Nested transaction are not supported but calling inside an existing transaction, 
- *      which must be compatible, (i.e. a write needs a WRITE transaction).
- *      causes the transaction to be used.
- *  </ul>  
+/** Application utilities for executing code in transactions.
+ * <p>
+ * Nested transaction are not supported but calling inside an existing transaction, 
+ * which must be compatible, (i.e. a write needs a WRITE transaction).
+ * causes the exising transaction to be used.
  */
 
 public class Txn {
-    /** Execute the Runnable in a read transaction. */
-    public static <T extends Transactional> void executeRead(T txn, Runnable r) {
-        boolean b = txn.isInTransaction() ;
-        if ( !b )
-            txn.begin(ReadWrite.READ) ;
-        try { r.run() ; }
-        catch (Throwable th) {
-            onThrowable(th, txn);
-            throw th ;
-        }
-        if ( ! b )
-            txn.end() ;
+    /**
+     * Execute in a "read" transaction that can promote to "write".
+     * <p>
+     * Such a transaction may abort if an update is executed
+     * by another thread before this one is promoted to "write" mode.
+     * If so, the data protected by {@code txn} is unchanaged.
+     * <p>
+     * If the application knows updates will be needed, consider using {@link #executeWrite}
+     * which starts in "write" mode.
+     * <p>
+     * The application code can call {@link Transactional#promote} to attempt to
+     * change from "read" to "write"; the {@link Transactional#promote promote} method
+     * returns a boolean indicating whether the promotion was possible or not. 
+     */
+    public static <T extends Transactional> void exec(T txn, Runnable r) {
+        exec(txn, TxnType.READ_PROMOTE, r);
     }
-    
-    /** Execute and return a value in a read transaction */
-    public static <T extends Transactional, X> X calculateRead(T txn, Supplier<X> r) {
-        boolean b = txn.isInTransaction() ;
-        if ( !b )
-            txn.begin(ReadWrite.READ) ;
-        try {
-            X x = r.get() ;
-            if ( !b )
-                txn.end() ;
-            return x ;
-        } catch (Throwable th) {
-            onThrowable(th, txn);
-            throw th ;
-        }
+
+    /**
+     * Execute in a "read" transaction that can promote to "write" and return some calculated value. 
+     * <p>
+     * Such a transaction may abort if an update is executed
+     * by another thread before this one is promoted to "write" mode.
+     * If so, the data protected by {@code txn} is unchanaged.
+     * <p>
+     * If the application knows updates will be needed, consider using {@link #executeWrite}
+     * which starts in "write" mode.
+     * <p>
+     * The application code can call {@link Transactional#promote} to attempt to
+     * change from "read" to "write"; the {@link Transactional#promote promote} method
+     * returns a boolean indicating whether the promotion was possible or not. 
+     */
+    public static <T extends Transactional, X> X calc(T txn, Supplier<X> r) {
+        return calc(txn, TxnType.READ_PROMOTE, r);
     }
 
-    /** Execute the Runnable in a write transaction */
-    public static <T extends Transactional> void executeWrite(T txn, Runnable r) {
+    /** Execute application code in a transaction with the given {@link TxnType trasnaction type}. */
+    public static <T extends Transactional> void exec(T txn, TxnType txnType, Runnable r) {
         boolean b = txn.isInTransaction() ;
-        if ( !b )
-            txn.begin(ReadWrite.WRITE) ;
+        if ( b )  {
+            TxnType txnTypeOuter = txn.transactionType();
+            if ( txnTypeOuter != txnType )
+                throw new JenaTransactionException("Already in a transaction of a different type: "
+                                                  +"outer="+txnTypeOuter+" : inner="+txnType);
+        } else
+            txn.begin(txnType) ;
         try { r.run() ; }
         catch (Throwable th) {
             onThrowable(th, txn);
@@ -81,24 +91,51 @@ public class Txn {
         }
     }
 
-    /** Execute and return a value in a write transaction. */
-    public static <T extends Transactional, X> X calculateWrite(T txn, Supplier<X> r) {
+    /** Execute and return a value in a transaction with the given {@link TxnType trasnaction type}. */
+    public static <T extends Transactional, X> X calc(T txn, TxnType txnType, Supplier<X> r) {
         boolean b = txn.isInTransaction() ;
-        if ( !b )
-            txn.begin(ReadWrite.WRITE) ;
-        X x = null ;
+        if ( b )  {
+            TxnType txnTypeOuter = txn.transactionType();
+            if ( txnTypeOuter != txnType )
+                throw new JenaTransactionException("Already in a transaction of a different type: "
+                                                  +"outer="+txnTypeOuter+" : inner="+txnType);
+        } else
+            txn.begin(txnType) ;
+    
+        X x;
         try { x = r.get() ; } 
         catch (Throwable th) {
             onThrowable(th, txn);
             throw th ;
         }
+        
         if ( !b ) {
             if ( txn.isInTransaction() )
                 // May have been explicit commit or abort.
                 txn.commit() ;
             txn.end() ;
         }
-        return x ;
+        return x;
+    }
+
+    /** Execute in a read transaction */
+    public static <T extends Transactional> void executeRead(T txn, Runnable r) {
+        exec(txn, TxnType.READ, r);
+    }
+    
+    /** Execute and return a value in a read transaction */
+    public static <T extends Transactional, X> X calculateRead(T txn, Supplier<X> r) {
+        return calc(txn, TxnType.READ, r);
+    }
+
+    /** Execute the Runnable in a write transaction */
+    public static <T extends Transactional> void executeWrite(T txn, Runnable r) {
+        exec(txn, TxnType.WRITE, r);
+    }
+
+    /** Execute and return a value in a write transaction. */
+    public static <T extends Transactional, X> X calculateWrite(T txn, Supplier<X> r) {
+        return calc(txn, TxnType.WRITE, r);
     }
     
     // Attempt some kind of cleanup.

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java b/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
index 8be8ae9..76ae02e 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.* ;
 
 import java.util.concurrent.atomic.AtomicLong ;
 
+import org.apache.jena.sparql.JenaTransactionException;
 import org.apache.jena.sparql.core.Transactional ;
 import org.apache.jena.sparql.core.TransactionalLock ;
 import org.apache.jena.system.Txn ;
@@ -62,6 +63,25 @@ public class TestTxnLifecycle {
         assertEquals(56,x) ;
     }
     
+    @Test(expected=JenaTransactionException.class)
+    public void txn_lifecycle_05a() {
+        int x = Txn.calculateRead(trans, ()-> {
+            // Does not continue outer transaction.
+            return Txn.calculateWrite(trans, ()->56) ;
+        });
+        assertEquals(56,x) ;
+    }
+    
+    @Test(expected=JenaTransactionException.class)
+    public void txn_lifecycle_05b() {
+        int x = Txn.calculateWrite(trans, ()-> {
+            // Does not continue outer transaction.
+            return Txn.calculateRead(trans, ()->56) ;
+        });
+        assertEquals(56,x) ;
+    }
+
+    
     @Test(expected=ExceptionFromTest.class)
     public void txn_lifecycle_06() {
         int x = Txn.calculateWrite(trans, ()-> {
@@ -71,6 +91,7 @@ public class TestTxnLifecycle {
         fail("Should not be here!") ;
     }
     
+    
     @Test public void txn_lifecycle_07() {
         Txn.executeWrite(trans, ()->trans.commit()) ; 
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-cmds/src/main/java/tdb2/tdbdump.java
----------------------------------------------------------------------
diff --git a/jena-cmds/src/main/java/tdb2/tdbdump.java b/jena-cmds/src/main/java/tdb2/tdbdump.java
index e8bd728..74f1e61 100644
--- a/jena-cmds/src/main/java/tdb2/tdbdump.java
+++ b/jena-cmds/src/main/java/tdb2/tdbdump.java
@@ -20,7 +20,7 @@ package tdb2;
 
 import arq.cmdline.ModLangOutput ;
 import jena.cmd.CmdException ;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.riot.RDFDataMgr ;
 import org.apache.jena.riot.RDFFormat ;
 import org.apache.jena.riot.RDFLanguages ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-cmds/src/main/java/tdb2/tdbstats.java
----------------------------------------------------------------------
diff --git a/jena-cmds/src/main/java/tdb2/tdbstats.java b/jena-cmds/src/main/java/tdb2/tdbstats.java
index 19797d0..0524ab5 100644
--- a/jena-cmds/src/main/java/tdb2/tdbstats.java
+++ b/jena-cmds/src/main/java/tdb2/tdbstats.java
@@ -22,7 +22,7 @@ import java.util.Iterator ;
 
 import org.apache.jena.atlas.lib.tuple.Tuple ;
 import org.apache.jena.atlas.logging.Log ;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.tdb2.solver.SolverLib;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/jenax/Txn.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/jenax/Txn.java b/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/jenax/Txn.java
deleted file mode 100644
index def9d47..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/apache/jena/dboe/jenax/Txn.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.dboe.jenax;
-
-import java.util.function.Supplier ;
-
-import org.apache.jena.sparql.core.Transactional ;
-
-/** Indirection to allow for modification for TDB2 capabilities */
-public class Txn {
-    public static <T extends Transactional> void executeRead(T txn, Runnable r) {
-        org.apache.jena.system.Txn.executeRead(txn, r);
-    }
-
-    public static <T extends Transactional, X> X calculateRead(T txn, Supplier<X> r) {
-        return org.apache.jena.system.Txn.calculateRead(txn, r);
-    }
-
-    public static <T extends Transactional> void executeWrite(T txn, Runnable r) {
-        org.apache.jena.system.Txn.executeWrite(txn, r);
-    }
-
-    public static <T extends Transactional, X> X calculateWrite(T txn, Supplier<X> r) {
-        return org.apache.jena.system.Txn.calculateWrite(txn, r);
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/bplustree/TestBPlusTreeTxn.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/bplustree/TestBPlusTreeTxn.java b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/bplustree/TestBPlusTreeTxn.java
index 8a9f673..321d3ae 100644
--- a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/bplustree/TestBPlusTreeTxn.java
+++ b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/bplustree/TestBPlusTreeTxn.java
@@ -20,7 +20,7 @@ package org.apache.jena.dboe.trans.bplustree;
 
 import org.apache.jena.dboe.base.file.Location;
 import org.apache.jena.dboe.index.test.IndexTestLib;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.test.RecordLib;
 import org.apache.jena.dboe.trans.bplustree.BPlusTree;
 import org.apache.jena.dboe.trans.bplustree.BPlusTreeFactory;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBinaryDataFile.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBinaryDataFile.java b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBinaryDataFile.java
index 996749b..3c15e7d 100644
--- a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBinaryDataFile.java
+++ b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBinaryDataFile.java
@@ -25,7 +25,7 @@ import static org.junit.Assert.assertNotEquals;
 import org.apache.jena.atlas.lib.Bytes ;
 import org.apache.jena.atlas.lib.StrUtils ;
 import org.apache.jena.dboe.base.file.*;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.trans.data.TransBinaryDataFile;
 import org.apache.jena.dboe.transaction.Transactional;
 import org.apache.jena.dboe.transaction.TransactionalFactory;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlob.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlob.java b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlob.java
index 95be5dd..36531a5 100644
--- a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlob.java
+++ b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlob.java
@@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicReference ;
 import org.apache.jena.dboe.base.file.BufferChannel;
 import org.apache.jena.dboe.base.file.BufferChannelMem;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.trans.data.TransBlob;
 import org.apache.jena.dboe.transaction.Transactional;
 import org.apache.jena.dboe.transaction.TransactionalFactory;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlobPersistent.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlobPersistent.java b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlobPersistent.java
index fe8e3bb..5000c4a 100644
--- a/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlobPersistent.java
+++ b/jena-db/jena-dboe-trans-data/src/test/java/org/apache/jena/dboe/trans/data/TestTransBlobPersistent.java
@@ -24,7 +24,7 @@ import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.dboe.base.file.BufferChannel;
 import org.apache.jena.dboe.base.file.BufferChannelFile;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.trans.data.TransBlob;
 import org.apache.jena.dboe.transaction.Transactional;
 import org.apache.jena.dboe.transaction.TransactionalFactory;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestThreadingTransactions.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestThreadingTransactions.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestThreadingTransactions.java
index 8b2bf64..5ea41e8 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestThreadingTransactions.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestThreadingTransactions.java
@@ -21,7 +21,7 @@ package org.apache.jena.dboe.transaction;
 import java.util.concurrent.Semaphore ;
 
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.system.ThreadAction;
 import org.apache.jena.system.ThreadTxn;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionCoordinatorControl.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionCoordinatorControl.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionCoordinatorControl.java
index f99b37a..2b6c962 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionCoordinatorControl.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionCoordinatorControl.java
@@ -24,7 +24,7 @@ import java.util.concurrent.Semaphore ;
 import java.util.concurrent.atomic.AtomicInteger ;
 
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.migrate.L;
 import org.apache.jena.dboe.transaction.txn.Transaction;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib.java
index e8bf804..a4e39dc 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.fail ;
 
 import org.apache.jena.system.ThreadTxn;
 import org.apache.jena.system.ThreadAction;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.ReadWrite ;
 import org.junit.Test ;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib2.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib2.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib2.java
index 463f7f9..ccd1515 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib2.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnLib2.java
@@ -20,7 +20,7 @@ package org.apache.jena.dboe.transaction;
 
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
 import org.junit.After ;
 import org.junit.Assert ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnSwitching.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnSwitching.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnSwitching.java
index d32fd55..6e8df63 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnSwitching.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTxnSwitching.java
@@ -22,7 +22,7 @@ import static org.junit.Assert.assertEquals ;
 import static org.junit.Assert.fail ;
 
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.transaction.txn.*;
 import org.apache.jena.dboe.transaction.txn.journal.Journal;
 import org.apache.jena.query.ReadWrite ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/Loader.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/Loader.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/Loader.java
index 1dbb5f0..3b97757 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/Loader.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/Loader.java
@@ -20,7 +20,7 @@ package org.apache.jena.tdb2.loader;
 
 import org.apache.jena.atlas.lib.ProgressMonitor ;
 import org.apache.jena.atlas.logging.FmtLog ;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.riot.RDFDataMgr ;
 import org.apache.jena.riot.system.ProgressStreamRDF ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/CopyDSG.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/CopyDSG.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/CopyDSG.java
index bb9f846..f751d3e 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/CopyDSG.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/CopyDSG.java
@@ -22,7 +22,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.jena.atlas.iterator.Iter;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
 import org.apache.jena.sparql.core.DatasetGraph;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/DatabaseOps.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/DatabaseOps.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/DatabaseOps.java
index db9976a..a673e94 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/DatabaseOps.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/sys/DatabaseOps.java
@@ -30,7 +30,7 @@ import org.apache.jena.atlas.lib.DateTimeUtils ;
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.atlas.logging.Log;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
 import org.apache.jena.dboe.transaction.txn.TransactionalSystem;
 import org.apache.jena.riot.Lang ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestDatabaseMgr.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestDatabaseMgr.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestDatabaseMgr.java
index 808c632..699bbb8 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestDatabaseMgr.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestDatabaseMgr.java
@@ -21,7 +21,7 @@ package org.apache.jena.tdb2;
 import static org.junit.Assert.*;
 import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.sparql.sse.SSE ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestTDBFactory.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestTDBFactory.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestTDBFactory.java
index cd6d965..fc3af0c 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestTDBFactory.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/TestTDBFactory.java
@@ -22,7 +22,7 @@ import static org.junit.Assert.*;
 import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.datatypes.xsd.XSDDatatype ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.rdf.model.Literal ;
 import org.apache.jena.rdf.model.Property ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestGraphsTDB2.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestGraphsTDB2.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestGraphsTDB2.java
index 7d6843c..71765d2 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestGraphsTDB2.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestGraphsTDB2.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.tdb2.graph;
 
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.tdb2.TDB2Factory;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/junit/QueryTestTDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/junit/QueryTestTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/junit/QueryTestTDB.java
index acfb7f4..57822e6 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/junit/QueryTestTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/junit/QueryTestTDB.java
@@ -20,7 +20,7 @@ package org.apache.jena.tdb2.junit;
 
 import java.util.List ;
 
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.* ;
 import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.sparql.SystemARQ ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/solver/TestStats.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/solver/TestStats.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/solver/TestStats.java
index 8be9d87..2b52e94 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/solver/TestStats.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/solver/TestStats.java
@@ -23,7 +23,7 @@ import static org.junit.Assert.assertEquals ;
 import java.util.Iterator ;
 
 import org.apache.jena.atlas.lib.tuple.Tuple ;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.sparql.sse.SSE ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/AbstractTestStoreConnectionBasics.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/AbstractTestStoreConnectionBasics.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/AbstractTestStoreConnectionBasics.java
index 42538d7..55d9b9a 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/AbstractTestStoreConnectionBasics.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/AbstractTestStoreConnectionBasics.java
@@ -22,7 +22,7 @@ package org.apache.jena.tdb2.store;
 import static org.junit.Assert.*;
 
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.sparql.sse.SSE ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestTransactions.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestTransactions.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestTransactions.java
index 787ec7e..acabff4 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestTransactions.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestTransactions.java
@@ -25,7 +25,7 @@ import org.apache.jena.atlas.iterator.Iter ;
 import static org.junit.Assert.*;
 import org.apache.jena.atlas.lib.StrUtils ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.dboe.transaction.txn.TransactionException;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.query.ReadWrite;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/Test_SPARQL_TDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/Test_SPARQL_TDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/Test_SPARQL_TDB.java
index cb335af..cb618ab 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/Test_SPARQL_TDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/Test_SPARQL_TDB.java
@@ -21,7 +21,7 @@ package org.apache.jena.tdb2.store;
 import static org.junit.Assert.*;
 import org.apache.jena.atlas.lib.StrUtils ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.graph.Triple ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
index 477a9e0..9e171d2 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
@@ -26,7 +26,7 @@ import static org.junit.Assert.assertTrue ;
 import org.apache.commons.io.FileUtils ;
 import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.dboe.jenax.Txn;
+import org.apache.jena.system.Txn;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.RDFDataMgr ;

http://git-wip-us.apache.org/repos/asf/jena/blob/87ab2a7b/jena-text/src/main/java/org/apache/jena/query/text/DatasetGraphText.java
----------------------------------------------------------------------
diff --git a/jena-text/src/main/java/org/apache/jena/query/text/DatasetGraphText.java b/jena-text/src/main/java/org/apache/jena/query/text/DatasetGraphText.java
index 4ac491f..a1dcb92 100644
--- a/jena-text/src/main/java/org/apache/jena/query/text/DatasetGraphText.java
+++ b/jena-text/src/main/java/org/apache/jena/query/text/DatasetGraphText.java
@@ -24,6 +24,7 @@ import java.util.List ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.ReadWrite ;
+import org.apache.jena.query.TxnType;
 import org.apache.jena.sparql.core.* ;
 import org.apache.lucene.queryparser.classic.QueryParserBase ;
 import org.slf4j.Logger ;
@@ -106,6 +107,17 @@ public class DatasetGraphText extends DatasetGraphMonitor implements Transaction
     }
 
     @Override
+    public void begin(TxnType txnType) {
+        switch(txnType) {
+            case READ_PROMOTE:
+            case READ_COMMITTED_PROMOTE:
+                throw new UnsupportedOperationException("begin("+txnType+")");
+            default:
+        }
+        begin(TxnType.convert(txnType));
+    }
+    
+    @Override
     public void begin(ReadWrite readWrite) {
         // Do not synchronized(txnLock) here. It will deadlock because if there
         // is an writer in commit, it can't