Class TransactionCoordinator
TransactionCoordinator per group of TransactionalComponents.
TransactionalComponents can not be shared across TransactionCoordinators.
This is a general engine although tested and most used for multiple-reader
and single-writer (MR+SW). TransactionalComponentLifecycle provides the
per-thread style.
Contrast to MRSW: multiple-reader or single-writer.
Block writers
Block until no writers are active. When this returns, this guarantees that the database is not changing and the journal is flushed to disk.
See blockWriters(), enableWriters(), execAsWriter(Runnable)
Exclusive mode
Exclusive mode is when the current thread is the only active code : no readers, no writers.
See startExclusiveMode()/tryExclusiveMode() finishExclusiveMode(), execExclusive(Runnable)
-
Nested Class Summary
Nested Classes -
Constructor Summary
ConstructorsConstructorDescriptionTransactionCoordinator(Location location) Create a TransactionCoordinator, initially with no associatedTransactionalComponentsTransactionCoordinator(Journal journal) Create a TransactionCoordinator, initially with no associatedTransactionalComponents.TransactionCoordinator(Journal journal, List<TransactionalComponent> components) Create a TransactionCoordinator, initially withTransactionalComponentsin the ComponentGroup -
Method Summary
Modifier and TypeMethodDescriptionAdd aTransactionalComponent.voidAdd a shutdown hook.addListener(TransactionListener listener) voidattach(TransactionCoordinatorState coordinatorState) Start a transaction.Start a transaction.voidBlock until no writers are active.longlonglonglonglonglonglongdetach(Transaction txn) voidAllow writers.voidexecAsWriter(Runnable action) Execute an action in as if a Write but no write transaction started.voidexecExclusive(Runnable action) Execute an action in exclusive mode.voidReturn to normal (release waiting transactions, allow new transactions).voidmodifyConfig(Runnable action) Perform modification of thisTransactionCoordiatorafter it has been started.Remove aTransactionalComponent.voidRemove a shutdown hookremoveListener(TransactionListener listener) voidvoidsetTxnIdGenerator(TxnIdGenerator generator) voidshutdown()voidshutdown(boolean silent) voidstart()voidEnter exclusive mode; block if necessary.booleanTry to block all writers, or return if can't at the moment.booleantryBlockWriters(boolean canBlock) Block until no writers are active, optionally blocking or returning if can't at the moment.booleanTry to enter exclusive mode.booleantryExclusiveMode(boolean canBlock) Try to enter exclusive mode.
-
Constructor Details
-
TransactionCoordinator
Create a TransactionCoordinator, initially with no associatedTransactionalComponents -
TransactionCoordinator
Create a TransactionCoordinator, initially with no associatedTransactionalComponents. -
TransactionCoordinator
Create a TransactionCoordinator, initially withTransactionalComponentsin the ComponentGroup
-
-
Method Details
-
add
Add aTransactionalComponent. Safe to call at any time but it is good practice is to add all the components before any transactions start. Internally, the coordinator ensures the add will safely happen but it does not add the component to existing transactions. This must be setup before recovery is attempted. -
remove
Remove aTransactionalComponent. -
addListener
-
removeListener
-
modifyConfig
Perform modification of thisTransactionCoordiatorafter it has been started.This operation enters exclusive mode, releases the configuration lock, then calls the
action. On exit from the action, it resets the configuration lock, and exits exclusive mode.Do not call inside a transaction, it may cause a deadlock.
Use with care!
-
add
Add a shutdown hook. Shutdown is not guaranteed to be called and hence hooks may not get called. -
remove
Remove a shutdown hook -
setQuorumGenerator
-
start
public void start() -
setTxnIdGenerator
-
getJournal
-
getLocation
-
detach
-
attach
-
shutdown
public void shutdown() -
shutdown
public void shutdown(boolean silent) -
startExclusiveMode
public void startExclusiveMode()Enter exclusive mode; block if necessary. There are no active transactions on return; new transactions will be held up in 'begin'. Return to normal (release waiting transactions, allow new transactions) withfinishExclusiveMode().Do not call inside an existing transaction.
-
tryExclusiveMode
public boolean tryExclusiveMode()Try to enter exclusive mode. If return is true, then there are no active transactions on return and new transactions will be held up in 'begin'. If false, there were in-progress transactions. Return to normal (release waiting transactions, allow new transactions) withfinishExclusiveMode().Do not call inside an existing transaction.
-
tryExclusiveMode
public boolean tryExclusiveMode(boolean canBlock) Try to enter exclusive mode. If return is true, then there are no active transactions on return and new transactions will be held up in 'begin'. If false, there were in-progress transactions. Return to normal (release waiting transactions, allow new transactions) withfinishExclusiveMode().Do not call inside an existing transaction.
- Parameters:
canBlock- Allow the operation block and wait for the exclusive mode lock.
-
finishExclusiveMode
public void finishExclusiveMode()Return to normal (release waiting transactions, allow new transactions). Must be paired with an earlierstartExclusiveMode(). -
execExclusive
Execute an action in exclusive mode. This method can block. Equivalent to:startExclusiveMode(); try { action.run(); } finally { finishExclusiveMode(); }- Parameters:
action-
-
blockWriters
public void blockWriters()Block until no writers are active. When this returns, this guarantees that the database is not changing and the journal is flushed to disk.The application must call
enableWriters()later.This operation must not be nested (it will block).
- See Also:
-
tryBlockWriters
public boolean tryBlockWriters()Try to block all writers, or return if can't at the moment.Unlike a write transaction, there is no associated transaction.
If it returns true, the application must call
enableWriters()later.- Returns:
- true if the operation succeeded and writers are blocked
- See Also:
-
tryBlockWriters
public boolean tryBlockWriters(boolean canBlock) Block until no writers are active, optionally blocking or returning if can't at the moment.Unlike a write transaction, there is no associated transaction.
If it returns true, the application must call
enableWriters()later.- Parameters:
canBlock-- Returns:
- true if the operation succeeded and writers are blocked
-
enableWriters
public void enableWriters()Allow writers. This must be used in conjunction withblockWriters()ortryBlockWriters()- See Also:
-
execAsWriter
Execute an action in as if a Write but no write transaction started. This method can block.Equivalent to:
blockWriters(); try { action.run(); } finally { enableWriters(); }- Parameters:
action-
-
begin
Start a transaction. This may block. -
begin
Start a transaction. Returns null if this operation would block. Readers can start at any time. A single writer policy is currently imposed so a "begin(WRITE)" may block. -
countActiveReaders
public long countActiveReaders() -
countActiveWriter
public long countActiveWriter() -
countActive
public long countActive() -
countBegin
public long countBegin() -
countBeginRead
public long countBeginRead() -
countBeginWrite
public long countBeginWrite() -
countFinished
public long countFinished()
-