LOL. Similar here, except I wrapped the Transactional with a Reenterent lock because I needed to try the begin. A side effect being I can promote the underlying Jena Transactional if I can promote the Reenterent lock. With a few caveats... There's a volatile write timestamp which I check after promoting to ensure I don't end up reading a different write transaction.
Dick -------- Original message --------From: Claude Warren <[email protected]> Date: 27/12/2017 11:29 (GMT+00:00) To: [email protected] Subject: Re: Txn code not handling type of transaction I recently wrote some code to try to handle a similar situation. In my case I knew I needed a transaction to be active at various points so I created a TransactionHolder. I create the holder and passing the object that has implements Transactional as well as the type of ReadWrite I want. If the transaction is active it does nothing (and I hope the proper transaction has been started) otherwise It starts the transaction. Ad the end I call commit or abort as appropriate. If I did not start the transaction the commit, abort or end is ignored. I think there may be an issue with abort in that it should probablyset up end() to throw an exception when I have not created the transaction so that the outer transaction will fail. import org.apache.jena.query.ReadWrite; import org.apache.jena.sparql.core.Transactional; public class TransactionHolder { private final Transactional txn; private final boolean started; private final ReadWrite rw; public TransactionHolder( Transactional txn, ReadWrite rw ) { this.txn = txn; this.rw = rw; started = ! txn.isInTransaction(); if (started) { txn.begin( rw ); } } public boolean ownsTranaction() { return started; } public void commit() { if (started) { txn.commit(); } } public void abort() { if (started) { txn.abort(); } } public void end() { if (started) { txn.end(); } } } On Wed, Dec 27, 2017 at 11:03 AM, dandh988 <[email protected]> wrote: > You cannot nest transactions nor can you promote a read to a write. > You need to rewrite your code or use txn which correctly checks if a > transaction is available and if not will begin the correct one, either READ > or WRITE. > > > Dick > -------- Original message --------From: George News <[email protected]> > Date: 27/12/2017 10:27 (GMT+00:00) To: Jena User Mailing List < > [email protected]> Subject: Txn code not handling type of transaction > Hi, > > As you know from other threads I'm having some issues with transactions. > Your suggestion is to use Txn instead of begin/end. Just for curiosity I > have checked the Txn code at [1] and it seems that inside you use > begin/end. > > However I have a doubt concerning how you handle the begin/end for READ > and WRITE. It seems that you open a transaction based on > txn.isInTransaction(), but how do you know if it is a READ or WRITE? > > If you create something like: > > Txn.executeRead(dataset, { > Txn.executeWrite(dataset, { > // Whatever > } > } > } > > the txn.begin(ReadWrite.WRITE) is not called and therefore it might be > leading to unexepected behaviours for the txn.commit(). > > could you give some hints on how this is handle internally? Before fully > modify the code I have, it might be easier to replicate the txn > behaviour ;) but I would like to know the above (if possible). > > As always, thanks in advanced > Jorge > > [1]: jena/jena-arq/src/main/java/org/apache/jena/system/Txn.java > -- I like: Like Like - The likeliest place on the web <http://like-like.xenei.com> LinkedIn: http://www.linkedin.com/in/claudewarren
