While my code does not solve the problem of lock promotion it handles the other cases.
Since there is no lock promotion there is no way to do what you want unless you convert all read locks to write locks or build some sort of wrapper/intercepter that will do some sort of release the lock and start again if necessary. Sounds fraught with problems. Claude On Wed, Dec 27, 2017 at 12:02 PM, George News <[email protected]> wrote: > 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 > >> > > > > > > > -- I like: Like Like - The likeliest place on the web <http://like-like.xenei.com> LinkedIn: http://www.linkedin.com/in/claudewarren
