public class ForwardingAsyncReadWriteTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D> extends com.google.common.collect.ForwardingObject implements AsyncReadWriteTransaction<P,D>
AsyncReadWriteTransaction implementation which forwards all interface method
 invocation to a delegate instance.| Modifier | Constructor and Description | 
|---|---|
| protected  | ForwardingAsyncReadWriteTransaction(AsyncReadWriteTransaction<P,D> delegate) | 
| Modifier and Type | Method and Description | 
|---|---|
| boolean | cancel()Cancels the transaction. | 
| void | close()Closes this transaction and releases all resources associated with it. | 
| com.google.common.util.concurrent.FluentFuture<? extends CommitInfo> | commit()Commits this transaction to be asynchronously applied to update the logical data tree. | 
| protected AsyncReadWriteTransaction<P,D> | delegate() | 
| void | delete(LogicalDatastoreType store,
      P path)Removes a piece of data from specified path. | 
| Object | getIdentifier() | 
protected ForwardingAsyncReadWriteTransaction(AsyncReadWriteTransaction<P,D> delegate)
protected AsyncReadWriteTransaction<P,D> delegate()
delegate in class com.google.common.collect.ForwardingObjectpublic Object getIdentifier()
getIdentifier in interface AsyncTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D>getIdentifier in interface org.opendaylight.yangtools.concepts.Identifiable<Object>public boolean cancel()
AsyncWriteTransactionAsyncWriteTransaction.commit() already
 successfully completed) will always fail (return false).cancel in interface AsyncWriteTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D>public com.google.common.util.concurrent.FluentFuture<? extends CommitInfo> commit()
AsyncWriteTransactionFluentFuture conveys the result of applying the data changes.
 
 This call logically seals the transaction, which prevents the client from further changing the data tree using
 this transaction. Any subsequent calls to put(LogicalDatastoreType, Path, Object),
 merge(LogicalDatastoreType, Path, Object), delete(LogicalDatastoreType, Path) will fail
 with IllegalStateException. The transaction is marked as committed and enqueued into the data store
 back-end for processing.
 
Whether or not the commit is successful is determined by versioning of the data tree and validation of registered commit participants if the transaction changes the data tree.
The effects of a successful commit of data depends on listeners and commit participants that are registered with the data broker.
  private void doWrite(final int tries) {
      WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
      MyDataObject data = ...;
      InstanceIdentifier<MyDataObject> path = ...;
      writeTx.put(LogicalDatastoreType.OPERATIONAL, path, data);
      Futures.addCallback(writeTx.commit(), new FutureCallback<CommitInfo>() {
          public void onSuccess(CommitInfo result) {
              // succeeded
          }
          public void onFailure(Throwable t) {
              if(t instanceof OptimisticLockFailedException) {
                  if(( tries - 1) > 0 ) {
                      // do retry
                      doWrite(tries - 1);
                  } else {
                      // out of retries
                  }
              } else {
                  // failed due to another type of TransactionCommitFailedException.
              }
          });
 }
 ...
 doWrite(2);
 
 Transaction may fail because of multiple reasons, such as
OptimisticLockFailedException. It is the responsibility
     of the caller to create a new transaction and commit the same modification again in order to update data
     tree.
     
       Warning: In most cases, retrying after an OptimisticLockFailedException will result in a high
       probability of success. However, there are scenarios, albeit unusual, where any number of retries will
       not succeed. Therefore it is strongly recommended to limit the number of retries (2 or 3) to avoid
       an endless loop.
     
   DataValidationFailedException. User
       should not retry to create new transaction with same data, since it probably will fail again.
   | Initial state | Tx 1 | Tx 2 | Result | 
|---|---|---|---|
| Empty | put(A,1) | put(A,2) | Tx 2 will fail, state is A=1 | 
| Empty | put(A,1) | merge(A,2) | A=2 | 
| Empty | merge(A,1) | put(A,2) | Tx 2 will fail, state is A=1 | 
| Empty | merge(A,1) | merge(A,2) | A=2 | 
| A=0 | put(A,1) | put(A,2) | Tx 2 will fail, A=1 | 
| A=0 | put(A,1) | merge(A,2) | A=2 | 
| A=0 | merge(A,1) | put(A,2) | Tx 2 will fail, A=1 | 
| A=0 | merge(A,1) | merge(A,2) | A=2 | 
| A=0 | delete(A) | put(A,2) | Tx 2 will fail, A does not exists | 
| A=0 | delete(A) | merge(A,2) | A=2 | 
| Initial state | Tx 1 | Tx 2 | Result | 
|---|---|---|---|
| Empty | put(TOP,[]) | put(TOP,[]) | Tx 2 will fail, state is TOP=[] | 
| Empty | put(TOP,[]) | merge(TOP,[]) | TOP=[] | 
| Empty | put(TOP,[FOO=1]) | put(TOP,[BAR=1]) | Tx 2 will fail, state is TOP=[FOO=1] | 
| Empty | put(TOP,[FOO=1]) | merge(TOP,[BAR=1]) | TOP=[FOO=1,BAR=1] | 
| Empty | merge(TOP,[FOO=1]) | put(TOP,[BAR=1]) | Tx 2 will fail, state is TOP=[FOO=1] | 
| Empty | merge(TOP,[FOO=1]) | merge(TOP,[BAR=1]) | TOP=[FOO=1,BAR=1] | 
| TOP=[] | put(TOP,[FOO=1]) | put(TOP,[BAR=1]) | Tx 2 will fail, state is TOP=[FOO=1] | 
| TOP=[] | put(TOP,[FOO=1]) | merge(TOP,[BAR=1]) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | merge(TOP,[FOO=1]) | put(TOP,[BAR=1]) | Tx 2 will fail, state is TOP=[FOO=1] | 
| TOP=[] | merge(TOP,[FOO=1]) | merge(TOP,[BAR=1]) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | delete(TOP) | put(TOP,[BAR=1]) | Tx 2 will fail, state is empty store | 
| TOP=[] | delete(TOP) | merge(TOP,[BAR=1]) | state is TOP=[BAR=1] | 
| TOP=[] | put(TOP/FOO,1) | put(TOP/BAR,1]) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | put(TOP/FOO,1) | merge(TOP/BAR,1) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | merge(TOP/FOO,1) | put(TOP/BAR,1) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | merge(TOP/FOO,1) | merge(TOP/BAR,1) | state is TOP=[FOO=1,BAR=1] | 
| TOP=[] | delete(TOP) | put(TOP/BAR,1) | Tx 2 will fail, state is empty store | 
| TOP=[] | delete(TOP) | merge(TOP/BAR,1] | Tx 2 will fail, state is empty store | 
| TOP=[FOO=1] | put(TOP/FOO,2) | put(TOP/BAR,1) | state is TOP=[FOO=2,BAR=1] | 
| TOP=[FOO=1] | put(TOP/FOO,2) | merge(TOP/BAR,1) | state is TOP=[FOO=2,BAR=1] | 
| TOP=[FOO=1] | merge(TOP/FOO,2) | put(TOP/BAR,1) | state is TOP=[FOO=2,BAR=1] | 
| TOP=[FOO=1] | merge(TOP/FOO,2) | merge(TOP/BAR,1) | state is TOP=[FOO=2,BAR=1] | 
| TOP=[FOO=1] | delete(TOP/FOO) | put(TOP/BAR,1) | state is TOP=[BAR=1] | 
| TOP=[FOO=1] | delete(TOP/FOO) | merge(TOP/BAR,1] | state is TOP=[BAR=1] | 
txA = broker.newWriteTransaction(); // allocates new transaction, data tree is empty txB = broker.newWriteTransaction(); // allocates new transaction, data tree is empty txA.put(CONFIGURATION, PATH, A); // writes to PATH value A txB.put(CONFIGURATION, PATH, B) // writes to PATH value B ListenableFuture futureA = txA.commit(); // transaction A is sealed and committed ListenebleFuture futureB = txB.commit(); // transaction B is sealed and committedCommit of transaction A will be processed asynchronously and data tree will be updated to contain value
A for PATH. Returned ListenableFuture will
 successfully complete once state is applied to data tree.
 Commit of Transaction B will fail, because previous transaction also modified path in a
 concurrent way. The state introduced by transaction B will not be applied. Returned
 ListenableFuture object will fail with OptimisticLockFailedException
 exception, which indicates to client that concurrent transaction prevented the committed
 transaction from being applied. 
 A successful commit produces implementation-specific CommitInfo structure, which is used to communicate
 post-condition information to the caller. Such information can contain commit-id, timing information or any
 other information the implementation wishes to share.
commit in interface AsyncWriteTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D>TransactionCommitFailedException or an exception derived from TransactionCommitFailedException.public void delete(LogicalDatastoreType store, P path)
AsyncWriteTransactiondelete in interface AsyncWriteTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D>store - Logical data store which should be modifiedpath - Data object pathpublic void close()
AsyncReadTransactionclose in interface AutoCloseableclose in interface AsyncReadTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D>Copyright © 2019 OpenDaylight. All rights reserved.