[ 
https://issues.apache.org/jira/browse/JENA-1458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16311997#comment-16311997
 ] 

ASF GitHub Bot commented on JENA-1458:
--------------------------------------

Github user afs commented on a diff in the pull request:

    https://github.com/apache/jena/pull/336#discussion_r159750664
  
    --- Diff: 
jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
 ---
    @@ -146,25 +162,84 @@ private void _begin(ReadWrite readWrite) {
         }
         
         /** Called transaction start code at most once per transaction. */ 
    -    private void startTransaction(ReadWrite mode) {
    -        transactionLock.enterCriticalSection(mode.equals(READ)); // get 
the dataset write lock, if needed.
    -        transactionType(mode);
    +    private void startTransaction(TxnType txnType, ReadWrite mode) {
    +        transactionLock.enterCriticalSection(mode.equals(ReadWrite.READ)); 
// get the dataset write lock, if needed.
    +        transactionType.set(txnType);
    +        transactionMode(mode);
             isInTransaction(true);
         }
     
         /** Called transaction ending code at most once per transaction. */ 
         private void finishTransaction() {
             isInTransaction.remove();
             transactionType.remove();
    +        transactionMode.remove();
             version.remove();
             transactionLock.leaveCriticalSection();
         }
          
    +    @Override
    +    public boolean promote() {
    +        if (!isInTransaction())
    +            throw new JenaTransactionException("Tried to promote outside a 
transaction!");
    +        if ( transactionMode().equals(ReadWrite.WRITE) )
    +            return true;
    +
    +        boolean readCommitted;
    +        // Initial state
    +        switch(transactionType.get()) {
    +            case WRITE :
    +                return true;
    +            case READ :
    +                throw new JenaTransactionException("Tried to promote READ 
transaction");
    +            case READ_COMMITTED_PROMOTE :
    +                readCommitted = true;
    +            case READ_PROMOTE :
    +                readCommitted = false;
    +                // Maybe!
    +                break;
    +            default:
    +                throw new NullPointerException();
    +        }
    +        
    +        try {
    +            _promote(readCommitted);
    +            return true;
    +        } catch (JenaTransactionException ex) {
    +            return false ;
    +        }
    +    }
    +    
    +    private void _promote(boolean readCommited) {
    +        //System.err.printf("Promote: version=%d generation=%d\n", 
version.get() , generation.get()) ;
    +        
    +        // Outside lock.
    +        if ( ! readCommited && version.get() != generation.get() )  {
    --- End diff --
    
    I'll take that as an "approved" :-) and merge it.
    
    This PR is big so we can keep reviewing after the merge if people want to 
make further comments.


> Transaction promotion
> ---------------------
>
>                 Key: JENA-1458
>                 URL: https://issues.apache.org/jira/browse/JENA-1458
>             Project: Apache Jena
>          Issue Type: Improvement
>    Affects Versions: Jena 3.6.0
>            Reporter: Andy Seaborne
>            Assignee: Andy Seaborne
>
> Expose the transaction promotion capabilities of TIM, TDB, and TDB2.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to