org.multiverse.api.TxnConfig Maven / Gradle / Ivy
The newest version!
package org.multiverse.api;
import org.multiverse.api.lifecycle.TxnListener;
import java.util.List;
/**
* Contains the transaction configuration used by a {@link Txn}. In the beginning this was all
* placed in the Txn, adding a lot of 'informational' methods to the transaction and therefor
* complicating its usage. So all the configurational properties of the transaction are contained in
* this structure.
*
* The same TxnConfig is used for multiple transactions. Each TxnFactory has just a
* single configuration and all Transactions created by that TxnFactory, share that configuration.
*
* @author Peter Veentjer.
*/
public interface TxnConfig {
/**
* Returns the Stm that creates transactions based on this configuration.
*
* @return the stm.
*/
Stm getStm();
/**
* Checks if the {@link org.multiverse.api.exceptions.ControlFlowError} is cached or a new one is used.
*
* Exception creation can be very expensive, so by default the ControlFlowError is reused, but this can
* be problematic when debugging.
*
* @return true if the ControlFlowError is reused.
* @see TxnFactoryBuilder#setControlFlowErrorsReused(boolean)
*/
boolean isControlFlowErrorsReused();
/**
* Gets the IsolationLevel used. With the IsolationLevel you have control on the isolated behavior between
* transactions.
*
* @return the IsolationLevel.
* @see TxnFactoryBuilder#setIsolationLevel(IsolationLevel)
*/
IsolationLevel getIsolationLevel();
/**
* Returns the total timeout in nanoseconds. Long.MAX_VALUE indicates that there is no
* timeout.
*
* @return the total remaining timeout.
* @see TxnFactoryBuilder#setTimeoutNs(long)
*/
long getTimeoutNs();
/**
* Returns the PropagationLevel used. With the PropagationLevel you have control on how the transaction
* is dealing with nesting of transactions.
*
* @return the PropagationLevel used.
* @see TxnFactoryBuilder#setPropagationLevel(PropagationLevel)
*/
PropagationLevel getPropagationLevel();
/**
* Returns the TraceLevel. With the TraceLevel you have control on the logging.
*
* @return the TraceLevel.
* @see TxnFactoryBuilder#setTraceLevel(TraceLevel)
*/
TraceLevel getTraceLevel();
/**
* Returns the BackoffPolicy used by the Stm when a transaction conflicts with another transaction.
*
* @return the BackoffPolicy used.
* @see TxnFactoryBuilder#setBackoffPolicy(BackoffPolicy)
*/
BackoffPolicy getBackoffPolicy();
/**
* Checks if speculative configuration is enabled. When enabled the STM is able to select better
* performing/scalable implementations at the cost of some
* {@link org.multiverse.api.exceptions.SpeculativeConfigurationError}. This will be caught by the
* TxnExecutor and the transaction will be retried, so in most cases this is not something to worry
* about, but it can be confusing in the beginning because of unexpected failures in the execution
* of transactions.
*
* @return true if speculative configuration is enabled.
* @see TxnFactoryBuilder#setSpeculative(boolean)
*/
boolean isSpeculative();
/**
* Returns the family name of this Txn. Every transaction in principle should have a family name. This
* information can be used for debugging/logging purposes but also other techniques that rely to know something
* about similar types of transactions like profiling.
*
* @return the familyName. The returned value can be null.
* @see TxnFactoryBuilder#setFamilyName(String)
*/
String getFamilyName();
/**
* Checks if this Txn is readonly. With a readonly transaction you can prevent any updates or
* new objects being created.
*
* @return true if readonly, false otherwise.
* @see TxnFactoryBuilder#setReadonly(boolean)
*/
boolean isReadonly();
/**
* Returns the maximum number of times the transaction is allowed to spin on a read to become
* readable (perhaps it is locked).
*
* @return the maximum number of spins
* @see TxnFactoryBuilder#setSpinCount(int)
*/
int getSpinCount();
/**
* Gets the current LockMode for all reads.
*
* @return the current LockMode for all reads.
* @see TxnFactoryBuilder#setReadLockMode(LockMode)
*/
LockMode getReadLockMode();
/**
* Gets the current LockMode for all writes.
*
* @return the current LockMode for all writes.
* @see TxnFactoryBuilder#setWriteLockMode(LockMode)
*/
LockMode getWriteLockMode();
/**
* Checks if dirty check is enabled on writes when a transaction commits. Turning of saves time,
* but forces writes that cause no change.
*
* @return true of dirty check is enabled.
* @see TxnFactoryBuilder#setDirtyCheckEnabled(boolean)
*/
boolean isDirtyCheckEnabled();
/**
* Checks if this transaction does automatic read tracking. Read tracking is needed for blocking transactions,
* but also for writeskew detection. Disadvantage of read tracking is that it is more expensive because
* the reads not to be registered on some datastructure so that they are tracked.
*
* @return true if the transaction does automatic read tracking, false otherwise.
* @see TxnFactoryBuilder#setReadTrackingEnabled(boolean)
*/
boolean isReadTrackingEnabled();
/**
* If an explicit retry (so a blocking transaction) is allowed. With this property one can prevent
* that a Txn is able to block waiting for some change.
*
* @return true if explicit retry is allowed, false otherwise.
* @see TxnFactoryBuilder#setBlockingAllowed(boolean)
*/
boolean isBlockingAllowed();
/**
* Checks if the Txn can be interrupted if it is blocking.
*
* @return true if the Txn can be interrupted if it is blocking, false otherwise.
* @see TxnFactoryBuilder#setInterruptible(boolean)
*/
boolean isInterruptible();
/**
* Returns an unmodifiable list containing all permanent TxnListener.
*
* @return unmodifiable List containing all permanent TxnListeners.
* @see TxnFactoryBuilder#addPermanentListener(org.multiverse.api.lifecycle.TxnListener)
*/
List getPermanentListeners();
/**
* Returns the maximum number of times this Txn be retried before failing. The returned value will
* always be equal or larger than 0. If the value is getAndSet high and you are encountering a lot of
* TooManyRetryExceptions it could be that the objects are just not concurrent enough.
*
* @return the maxRetries.
* @see TxnFactoryBuilder#setMaxRetries(int)
*/
int getMaxRetries();
}