On 2017-12-27 12:52, dandh988 wrote: > 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.
Do you have example code? Just to have a guide to migrate the idea. > > 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 >> > > >
