public interface Transaction
All database operations that access the graph, indexes, or the schema must be performed in a transaction.
If you attempt to access the graph outside of a transaction, those operations will throw
NotInTransactionException
.
Transactions are bound to the thread in which they were created. Transactions can either be handled programmatically, through this interface, or by a container through the Java Transaction API (JTA). The Transaction interface makes handling programmatic transactions easier than using JTA programmatically. Here's the idiomatic use of programmatic transactions in Neo4j:
Transaction tx = graphDb.beginTx();
try
{
// operations on the graph
// ...
tx.success();
}
finally
{
tx.finish();
}
Let's walk through this example line by line. First we retrieve a Transaction
object by invoking the GraphDatabaseService.beginTx()
factory method.
This creates a new transaction which has internal state to keep
track of whether the current transaction is successful. Then we wrap all
operations that modify the graph in a try-finally block. At the end
of the block, we invoke the tx.success()
method to indicate
that the transaction is successful. As we exit the block, the finally clause
will kick in and tx.finish()
will commit the transaction if
the internal state indicates success or else mark it for rollback.
If an exception is raised in the try-block, success()
will never be
invoked and the internal state of the transaction object will cause
finish()
to roll back the transaction. This is very important:
unless success()
is invoked, the transaction will fail upon
finish()
. A transaction can be explicitly marked for rollback by
invoking the failure()
method.
Read operations inside of a transaction will also read uncommitted data from the same transaction.
All ResourceIterables
that where returned from operations executed inside a transaction
will be automatically closed when the transaction is committed or rolled back.
Note however, that the ResourceIterator
should be closed
as soon as
possible if you don't intend to exhaust the iterator.
Modifier and Type | Method and Description |
---|---|
Lock |
acquireReadLock(PropertyContainer entity)
Acquires a read lock for
entity for this transaction. |
Lock |
acquireWriteLock(PropertyContainer entity)
Acquires a write lock for
entity for this transaction. |
void |
failure()
Marks this transaction as failed, which means that it will
unconditionally be rolled back when
finish() is called. |
void |
finish()
|
void |
success()
|
void failure()
void success()
void finish()
success()
or failure()
has been previously invoked.
All ResourceIterables
that where returned from operations executed inside this
transaction will be automatically closed by this method.Lock acquireWriteLock(PropertyContainer entity)
entity
for this transaction.
The lock (returned from this method) can be released manually, but
if not it's released automatically when the transaction finishes.entity
- the entity to acquire a lock for. If another transaction
currently holds a write lock to that entity this call will wait until
it's released.Lock
which optionally can be used to release this
lock earlier than when the transaction finishes. If not released
(with Lock.release()
it's going to be released with the
transaction finishes.Lock acquireReadLock(PropertyContainer entity)
entity
for this transaction.
The lock (returned from this method) can be released manually, but
if not it's released automatically when the transaction finishes.entity
- the entity to acquire a lock for. If another transaction
currently hold a write lock to that entity this call will wait until
it's released.Lock
which optionally can be used to release this
lock earlier than when the transaction finishes. If not released
(with Lock.release()
it's going to be released with the
transaction finishes.Copyright © 2002-2013 The Neo4j Graph Database Project. All Rights Reserved.