P
- Type of path (subtree identifier), which represents location in
treeD
- Type of data (payload), which represents data payloadpublic interface AsyncReadWriteTransaction<P extends org.opendaylight.yangtools.concepts.Path<P>,D> extends AsyncReadTransaction<P,D>, AsyncWriteTransaction<P,D>
The initial state of the write transaction is stable snapshot of current data tree state captured when transaction was created and it's state and underlying data tree are not affected by other concurrently running transactions.
Write transactions are isolated from other concurrent write transactions. All writes are local to the transaction and represents only a proposal of state change for data tree and it is not visible to any other concurrently running transactions.
Applications publish the changes proposed in the transaction by calling AsyncWriteTransaction.commit()
on the transaction. This seals the transaction
(preventing any further writes using this transaction) and commits it to be
processed and applied to global conceptual data tree.
The transaction commit may fail due to a concurrent transaction modifying and committing data in
an incompatible way. See AsyncWriteTransaction.commit()
for more concrete commit failure examples.
Implementation Note: This interface is not intended to be implemented
by users of MD-SAL, but only to be consumed by them.
Let's assume initial state of data tree for PATH
is A
.
txWrite = broker.newReadWriteTransaction(); // concurrent write transaction txWrite.read(OPERATIONAL,PATH).get() // will return Optional containing A txWrite.put(OPERATIONAL,PATH,B); // writes B to PATH txWrite.read(OPERATIONAL,PATH).get() // will return Optional Containing B txWrite.commit().get(); // data tree is updated, PATH contains B tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
As you could see read-write transaction provides capabilities as
AsyncWriteTransaction
but also allows for reading proposed changes as
if they already happened.
PATH
is A
.
txRead = broker.newReadOnlyTransaction(); // read Transaction is snapshot of data txWrite = broker.newReadWriteTransaction(); // concurrent write transaction txRead.read(OPERATIONAL,PATH).get(); // will return Optional containing A txWrite.read(OPERATIONAL,PATH).get() // will return Optional containing A txWrite.put(OPERATIONAL,PATH,B); // writes B to PATH txWrite.read(OPERATIONAL,PATH).get() // will return Optional Containing B txRead.read(OPERATIONAL,PATH).get(); // concurrent read transaction still returns // Optional containing A txWrite.commit().get(); // data tree is updated, PATH contains B txRead.read(OPERATIONAL,PATH).get(); // still returns Optional containing A tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
PATH
is A
.
tx1 = broker.newReadWriteTransaction(); // read Transaction is snapshot of data tx2 = broker.newReadWriteTransaction(); // concurrent write transaction tx1.read(OPERATIONAL,PATH).get(); // will return Optional containing A tx2.read(OPERATIONAL,PATH).get() // will return Optional containing A tx2.put(OPERATIONAL,PATH,B); // writes B to PATH tx2.read(OPERATIONAL,PATH).get() // will return Optional Containing B tx1.read(OPERATIONAL,PATH).get(); // tx1 read-write transaction still sees Optional // containing A since is isolated from tx2 tx1.put(OPERATIONAL,PATH,C); // writes C to PATH tx1.read(OPERATIONAL,PATH).get() // will return Optional Containing C tx2.read(OPERATIONAL,PATH).get() // tx2 read-write transaction still sees Optional // containing B since is isolated from tx1 tx2.commit().get(); // data tree is updated, PATH contains B tx1.read(OPERATIONAL,PATH).get(); // still returns Optional containing C since is isolated from tx2 tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B tx1.commit() // Will fail with OptimisticLockFailedException // which means concurrent transaction changed the same PATH
Note: examples contains blocking calls on future only to illustrate
that action happened after other asynchronous action. Use of blocking call
Future.get()
is discouraged for most uses and you should
use
Futures.addCallback(com.google.common.util.concurrent.ListenableFuture,
com.google.common.util.concurrent.FutureCallback)
or other functions from Futures
to
register more specific listeners.
AsyncReadTransaction
,
AsyncWriteTransaction
close
cancel, commit, delete
getIdentifier
Copyright © 2019 OpenDaylight. All rights reserved.