Class AbstractTransactionContext
- All Implemented Interfaces:
TransactionContext
- Direct Known Subclasses:
GlobalTransactionContext
,LocalTransactionContext
XAResourceImpl
.- Since:
- 1.0
- Version:
- $Revision: 8660 $ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
- Author:
- Assaf Arkin , Ralf Joachim, Werner Guttmann, Gregory Block
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionfinal void
addTxSynchronizable
(TxSynchronizable synchronizable) Register a listener which wants to synchronize its state to the state of the transaction.protected final void
final void
close()
Closes all Connections.protected abstract void
The derived class must implement this method and close all the connections used in this transaction.final void
commit()
Commits all changes and closes the transaction releasing all locks on all objects.protected abstract void
The derived class must implement this method and commit all the connections used in this transaction.protected final Iterator
<Connection> final void
create
(ClassMolder molder, Object object, OID depended) Creates a new object in persistent storage.protected abstract Connection
createConnection
(LockEngine engine) final void
Deletes the object from persistent storage.final void
expireCache
(ClassMolder molder, Identity identity) Expire object from the cache.final Object
fetch
(ClassMolder molder, Identity identity, AccessMode suggestedAccessMode) final ClassLoader
Get the current application ClassLoader.final Connection
getConnection
(LockEngine engine) Return an open connection for the specified engine.final DbMetaInfo
getConnectionInfo
(LockEngine engine) Returns meta-data related to the RDBMS used.final Database
final InstanceFactory
final int
Returns the timeout waiting to acquire a lock.final NamedNativeQuery
getNamedNativeQuery
(ClassMolder molder, String name) Returns a NamedNativeQuery instance query based upon a named query as defined in the mapping file.final String
getNamedQuery
(ClassMolder molder, String name) Creates an OQL query based upon a named query as defined in the mapping file.final int
Returns the status of this transaction.final int
Returns the timeout of this transaction.final ObjectLock
Returns the lock which this transaction attempts to acquire.final boolean
Test if autoStore option is enabled or not.final boolean
isCached
(ClassMolder molder, Class cls, Identity identity) final boolean
Returns true if the object is marked as created in this transaction.final boolean
Returns true if and only if the specified object is loaded or created in this transaction and is deleted.final boolean
isDeletedByOID
(OID oid) final boolean
isDepended
(OID master, Object dependent) final boolean
isLocked
(Class cls, Identity identity, LockEngine lockEngine) Returns true if the object given is locked.final boolean
isOpen()
Returns true if the transaction is open.final boolean
isPersistent
(Object object) Returns true if the object is persistent in this transaction.final boolean
isReadOnly
(Object object) Check to see whether this transaction considers an object to have been marked read-only.final boolean
isRecorded
(Object object) Returns true if the object has been previously queried/loaded/updated/created in this transaction.final boolean
isUpdateCacheNeeded
(Object object) Retrieves the state of the object in this transaction.final boolean
isUpdatePersistNeeded
(Object object) Retrieves the state of the object in this transaction.final Iterator
Expose an enumeration of the commited object entries to allow TxSynchronizable to iterate through the objects.final Object
load
(Identity identity, ProposedEntity proposedObject, AccessMode suggestedAccessMode) Load an object for use within the transaction.final Object
load
(Identity identity, ProposedEntity proposedObject, AccessMode suggestedAccessMode, QueryResults results) Load an object for use within the transaction.final void
markCreate
(ClassMolder molder, Object object, OID rootObjectOID) Walk a data object tree starting from the specified object, and mark all objects to be created.final void
markModified
(Object object, boolean updatePersist, boolean updateCache) final boolean
markUpdate
(ClassMolder molder, Object object, OID depended) Update a new object in persistent storage and returns the object's OID.final boolean
prepare()
Prepares the transaction prior to committing it.final QueryResults
query
(LockEngine engine, PersistenceQuery query, AccessMode accessMode, boolean scrollable) Perform a query using the query mechanism with the specified access mode.final void
removeTxSynchronizable
(TxSynchronizable synchronizable) Unregister a listener which wants to synchronize its state to the state of the transaction.final void
rollback()
Rolls back all changes and closes the transaction releasing all locks on all objects.protected abstract void
The derived class must implement this method and rollback all the connections used in this transaction.final void
setAutoStore
(boolean autoStore) Enable or disable autoStore.final void
setCallback
(CallbackInterceptor callback) Overrides the default callback interceptor by a custom interceptor for this database source.final void
setInstanceFactory
(InstanceFactory factory) Overrides the default instance factory by a custom one for this database source.final void
setLockTimeout
(int timeout) Sets the timeout waiting to acquire a lock.final void
setStatus
(int status) Sets the status of the current transaction to the given one.final void
setTransactionTimeout
(int timeout) Sets the timeout of this transaction.final void
setWaitOnLock
(ObjectLock lock) Indicates which lock this transaction is waiting for.void
trackObject
(ClassMolder molder, OID oid, Object object) void
untrackObject
(Object object) final void
update
(ClassMolder molder, Object object, OID depended) Update a new object in persistent storage and returns the object's OID.final void
Acquire a write lock on the object.
-
Constructor Details
-
AbstractTransactionContext
Create a new transaction context. This method is used by the explicit transaction model.- Parameters:
db
- Database instance
-
-
Method Details
-
addTxSynchronizable
Register a listener which wants to synchronize its state to the state of the transaction.- Specified by:
addTxSynchronizable
in interfaceTransactionContext
- Parameters:
synchronizable
- The TxSynchronizable implementation to register.- See Also:
-
removeTxSynchronizable
Unregister a listener which wants to synchronize its state to the state of the transaction.- Specified by:
removeTxSynchronizable
in interfaceTransactionContext
- Parameters:
synchronizable
- The TxSynchronizable implementation to unregister.- See Also:
-
setAutoStore
public final void setAutoStore(boolean autoStore) Enable or disable autoStore. If enabled, all new objects, which are reachable from other object that are queried, loaded, created in the transaction, will be created when the transaction is committed.- Specified by:
setAutoStore
in interfaceTransactionContext
- Parameters:
autoStore
- When set totrue
autoStore will be enabled.- See Also:
-
isAutoStore
public final boolean isAutoStore()Test if autoStore option is enabled or not.- Specified by:
isAutoStore
in interfaceTransactionContext
- Returns:
true
if autoStore option is enabled.- See Also:
-
setCallback
Overrides the default callback interceptor by a custom interceptor for this database source.The interceptor is a callback that notifies data objects on persistent state events.
If callback interceptor is not overriden, events will be sent to data object that implements the org.exolab.castor.jdo.Persistent interface.
- Specified by:
setCallback
in interfaceTransactionContext
- Parameters:
callback
- The callback interceptor, disabled if null.- See Also:
-
setInstanceFactory
Overrides the default instance factory by a custom one for this database source.The factory is used to obatain a new instance of data object when it is needed during loading.
- Specified by:
setInstanceFactory
in interfaceTransactionContext
- Parameters:
factory
- The instanceFactory to be used, disable if null.- See Also:
-
getInstanceFactory
-
setTransactionTimeout
public final void setTransactionTimeout(int timeout) Sets the timeout of this transaction. The timeout is specified in seconds.- Specified by:
setTransactionTimeout
in interfaceTransactionContext
- Parameters:
timeout
- The timeout for this transaction in seconds.- See Also:
-
getTransactionTimeout
public final int getTransactionTimeout()Returns the timeout of this transaction. The timeout is specified in seconds.- Specified by:
getTransactionTimeout
in interfaceTransactionContext
- Returns:
- The timeout of this transaction in seconds.
- See Also:
-
getLockTimeout
public final int getLockTimeout()Returns the timeout waiting to acquire a lock. The timeout is specified in seconds.- Specified by:
getLockTimeout
in interfaceTransactionContext
- Returns:
- The timeout waiting to acquire a lock in seconds.
- See Also:
-
setLockTimeout
public final void setLockTimeout(int timeout) Sets the timeout waiting to acquire a lock. The timeout is specified in seconds.- Specified by:
setLockTimeout
in interfaceTransactionContext
- Parameters:
timeout
- The timeout waiting to acquire a lock in seconds.- See Also:
-
setStatus
public final void setStatus(int status) Sets the status of the current transaction to the given one.- Specified by:
setStatus
in interfaceTransactionContext
- Parameters:
status
- The status to set for this transaction.- See Also:
-
getConnection
Return an open connection for the specified engine. Only one connection should be created for a given engine in the same transaction.- Specified by:
getConnection
in interfaceTransactionContext
- Parameters:
engine
- The persistence engine.- Returns:
- An open connection.
- Throws:
ConnectionFailedException
- See Also:
-
createConnection
- Throws:
ConnectionFailedException
-
connectionsIterator
-
clearConnections
protected final void clearConnections() -
commitConnections
The derived class must implement this method and commit all the connections used in this transaction. If the transaction could not commit fully or partially, this method will throw anTransactionAbortedException
, causing a rollback to occur as the next step.- Throws:
TransactionAbortedException
- The transaction could not commit fully or partially and should be rolled back.
-
closeConnections
The derived class must implement this method and close all the connections used in this transaction.- Throws:
TransactionAbortedException
- The transaction could not close all the connections.
-
rollbackConnections
protected abstract void rollbackConnections()The derived class must implement this method and rollback all the connections used in this transaction. The connections may be closed, as they will not be reused in this transaction. This operation is guaranteed to succeed. -
getConnectionInfo
Returns meta-data related to the RDBMS used.- Specified by:
getConnectionInfo
in interfaceTransactionContext
- Parameters:
engine
- LockEngine instance used.- Returns:
- A DbMetaInfo instance describing various features of the underlying RDBMS.
- Throws:
PersistenceException
- An error occured talking to the persistence engine.- See Also:
-
fetch
public final Object fetch(ClassMolder molder, Identity identity, AccessMode suggestedAccessMode) throws PersistenceException - Specified by:
fetch
in interfaceTransactionContext
- Throws:
PersistenceException
- See Also:
-
load
public final Object load(Identity identity, ProposedEntity proposedObject, AccessMode suggestedAccessMode) throws PersistenceException Load an object for use within the transaction. Multiple access to the same object within the transaction will return the same object instance (except for read-only access).This method is similar to
TransactionContext.fetch(org.exolab.castor.persist.ClassMolder, org.exolab.castor.persist.spi.Identity, org.exolab.castor.mapping.AccessMode)
except that it will load the object only once within a transaction and always return the same instance.If the object is loaded for read-only then no lock is acquired and updates to the object are not reflected at commit time. If the object is loaded for read-write then a read lock is acquired (unless timeout or deadlock detected) and the object is stored at commit time. The object is then considered persistent and may be deleted or upgraded to write lock. If the object is loaded for exclusive access then a write lock is acquired and the object is synchronized with the persistent copy.
Attempting to load the object twice in the same transaction, once with exclusive lock and once with read-write lock will result in an exception.
- Specified by:
load
in interfaceTransactionContext
- Parameters:
identity
- The object's identity.proposedObject
- The object to fetch (single instance per transaction).suggestedAccessMode
- The access mode (seeAccessMode
) the values in persistent storage.- Returns:
- object being loaded.
- Throws:
PersistenceException
- Timeout or deadlock occured attempting to acquire lock on object. The object was not found in persistent storage. An error reported by the persistence engine.- See Also:
-
load
public final Object load(Identity identity, ProposedEntity proposedObject, AccessMode suggestedAccessMode, QueryResults results) throws PersistenceException Load an object for use within the transaction. Multiple access to the same object within the transaction will return the same object instance (except for read-only access).In addition to
TransactionContext.load(Identity,ProposedEntity,AccessMode)
a QueryResults can be specified.- Specified by:
load
in interfaceTransactionContext
- Parameters:
identity
- The object's identity.proposedObject
- The object to fetch (single instance per transaction).suggestedAccessMode
- The access mode (seeAccessMode
) the values in persistent storage.results
- The QueryResult that the data to be loaded from.- Returns:
- object being loaded.
- Throws:
PersistenceException
- Timeout or deadlock occured attempting to acquire lock on object. The object was not found in persistent storage. An error reported by the persistence engine.- See Also:
-
untrackObject
-
trackObject
-
query
public final QueryResults query(LockEngine engine, PersistenceQuery query, AccessMode accessMode, boolean scrollable) throws PersistenceException Perform a query using the query mechanism with the specified access mode. The query is performed in this transaction, and the returned query results can only be used while this transaction is open. It is assumed that the query mechanism is compatible with the persistence engine.- Specified by:
query
in interfaceTransactionContext
- Parameters:
engine
- The persistence engine.query
- A query against the persistence engine.accessMode
- The access mode.scrollable
- The db cursor mode.- Returns:
- A query result iterator
- Throws:
PersistenceException
- An error reported by the persistence engine or an invalid query.- See Also:
-
markCreate
public final void markCreate(ClassMolder molder, Object object, OID rootObjectOID) throws PersistenceException Walk a data object tree starting from the specified object, and mark all objects to be created.- Specified by:
markCreate
in interfaceTransactionContext
- Parameters:
molder
- The class persistence molder.object
- The object to persist.rootObjectOID
- The OID of the root object to start walking.- Throws:
PersistenceException
- An object with this identity already exists in persistent storage. The class is not persistent capable. An error reported by the persistence engine.- See Also:
-
create
public final void create(ClassMolder molder, Object object, OID depended) throws PersistenceException Creates a new object in persistent storage. The object will be persisted only if the transaction commits. If an identity is provided then duplicate identity check happens in this method, if no identity is provided then duplicate identity check occurs when the transaction completes and the object is not visible in this transaction.- Specified by:
create
in interfaceTransactionContext
- Parameters:
molder
- The molder of the creating class.object
- The object to persist.depended
- The master object's OID if exist.- Throws:
PersistenceException
- An object with this identity already exists in persistent storage. The class is not persistent capable. An error reported by the persistence engine.- See Also:
-
markUpdate
public final boolean markUpdate(ClassMolder molder, Object object, OID depended) throws PersistenceException Update a new object in persistent storage and returns the object's OID. The object will be persisted only if the transaction commits. If an identity is provided then duplicate identity check happens in this method, if no identity is provided then duplicate identity check occurs when the transaction completes and the object is not visible in this transaction.Update will also mark objects to be created if the TIMESTAMP equals to NO_TIMESTAMP.
- Specified by:
markUpdate
in interfaceTransactionContext
- Parameters:
molder
- The object's molder.object
- The object to persist.depended
- The master objects of the specified object to be created if exisit.- Returns:
- true if the object is marked to be created.
- Throws:
PersistenceException
- An object with this identity already exists in persistent storage. The class is not persistent capable. Dirty checking mechanism may immediately report that the object was modified in the database during the long transaction. An error reported by the persistence engine.- See Also:
-
update
public final void update(ClassMolder molder, Object object, OID depended) throws PersistenceException Update a new object in persistent storage and returns the object's OID. The object will be persisted only if the transaction commits. If an identity is provided then duplicate identity check happens in this method, if no identity is provided then duplicate identity check occurs when the transaction completes and the object is not visible in this transaction.Update will also mark objects to be created if the TIMESTAMP equals to NO_TIMESTAMP.
- Specified by:
update
in interfaceTransactionContext
- Parameters:
molder
- The object's molder.object
- The object to persist.depended
- The master objects of the specified object to be created if exisit.- Throws:
PersistenceException
- An object with this identity already exists in persistent storage. The class is not persistent capable. Dirty checking mechanism may immediately report that the object was modified in the database during the long transaction. An error reported by the persistence engine.- See Also:
-
delete
Deletes the object from persistent storage. The deletion will take effect only if the transaction is committed, but the object is no longer viewable for the current transaction and locks for access from other transactions will block until this transaction completes. A write lock is acquired in order to assure the object can be deleted.- Specified by:
delete
in interfaceTransactionContext
- Parameters:
object
- The object to delete from persistent storage.- Throws:
PersistenceException
- The object has not been queried or created in this transaction. Timeout or deadlock occured attempting to acquire lock on object. An error reported by the persistence engine.- See Also:
-
writeLock
Acquire a write lock on the object. Read locks are implicitly available when the object is queried. A write lock is only granted for objects that are created or deleted or for objects loaded in exclusive mode - this method can obtain such a lock explicitly. If the object already has a write lock in this transaction or a read lock in this transaction but no read lock in any other transaction, a write lock is obtained. If this object has a read lock in any other transaction this method will block until the other transaction will release its lock. If the specified timeout has elapsed or a deadlock has been detected, an exception will be thrown but the current lock will be retained.- Specified by:
writeLock
in interfaceTransactionContext
- Parameters:
object
- The object to lock.timeout
- Timeout waiting to acquire lock, specified in seconds, zero for no waiting, negative to use the default timeout for this transaction.- Throws:
PersistenceException
- The object has not been queried or created in this transaction. Timeout or deadlock occured attempting to acquire lock on object. An error reported by the persistence engine.- See Also:
-
markModified
- Specified by:
markModified
in interfaceTransactionContext
- See Also:
-
prepare
Prepares the transaction prior to committing it. Indicates whether the transaction is read-only (i.e. no modified objects), can commit, or an error has occured and the transaction must be rolled back. This method performs actual storage into the persistence storage. Multiple calls to this method can be done, and do not release locks, allowing checkpoint to occur. An IllegalStateException is thrown if transaction is not in the proper state to perform this operation.- Specified by:
prepare
in interfaceTransactionContext
- Returns:
- True if the transaction can commit, false if the transaction is read only
- Throws:
TransactionAbortedException
- The transaction has been aborted due to inconsistency, duplicate object identity, error with the persistence engine or any other reason.- See Also:
-
commit
Commits all changes and closes the transaction releasing all locks on all objects. All objects are now transient. Must be called after a call toTransactionContext.prepare()
has returned successfully. Throws an IllegalStateException when called without callingTransactionContext.prepare()
first.- Specified by:
commit
in interfaceTransactionContext
- Throws:
TransactionAbortedException
- The transaction has been aborted due to inconsistency, duplicate object identity, error with the persistence engine or any other reason.- See Also:
-
iterateReadWriteObjectsInTransaction
Expose an enumeration of the commited object entries to allow TxSynchronizable to iterate through the objects.- Specified by:
iterateReadWriteObjectsInTransaction
in interfaceTransactionContext
- Returns:
- Iterator of modifiable (read-write) object entries.
- See Also:
-
rollback
public final void rollback()Rolls back all changes and closes the transaction releasing all locks on all objects. All objects are now transient, if they were queried in this transaction. This method may be called at any point during the transaction. Throws an IllegalStateException if transaction is not in the proper state to perform this operation.- Specified by:
rollback
in interfaceTransactionContext
- See Also:
-
close
Closes all Connections. Must be called before the end of the transaction in EJB environment or after commit in standalone case. Throws an IllegalStateException if this method has been called after the end of the transaction.- Specified by:
close
in interfaceTransactionContext
- Throws:
TransactionAbortedException
- The transaction has been aborted due to inconsistency, duplicate object identity, error with the persistence engine or any other reason.- See Also:
-
isCreated
Returns true if the object is marked as created in this transaction. Note that this does not find objects in the 'transitional' state of creating. Primarily intended to be used by tests.- Specified by:
isCreated
in interfaceTransactionContext
- Parameters:
object
- The object to test the state of in this transaction.- Returns:
true
if the object is marked as created within this transaction.- See Also:
-
isUpdateCacheNeeded
Retrieves the state of the object in this transaction. Specifically, in this case, that the object requires a cache update.- Specified by:
isUpdateCacheNeeded
in interfaceTransactionContext
- Parameters:
object
- The object to test the state of in this transaction.- Returns:
true
if the object is recorded in this transaction with the requested state.- See Also:
-
isUpdatePersistNeeded
Retrieves the state of the object in this transaction. Specifically, in this case, that the object requires a persistence update.- Specified by:
isUpdatePersistNeeded
in interfaceTransactionContext
- Parameters:
object
- The object to test the state of in this transaction.- Returns:
true
if the object is recorded in this transaction with the requested state.- See Also:
-
isPersistent
Returns true if the object is persistent in this transaction.- Specified by:
isPersistent
in interfaceTransactionContext
- Parameters:
object
- The object.- Returns:
true
if persistent in transaction.- See Also:
-
isRecorded
Returns true if the object has been previously queried/loaded/updated/created in this transaction.- Specified by:
isRecorded
in interfaceTransactionContext
- Parameters:
object
- The object to investigate.- Returns:
true
if recorded in this transaction.- See Also:
-
isDepended
- Specified by:
isDepended
in interfaceTransactionContext
- See Also:
-
getStatus
public final int getStatus()Returns the status of this transaction.- Specified by:
getStatus
in interfaceTransactionContext
- Returns:
- The status of this transaction.
- See Also:
-
isOpen
public final boolean isOpen()Returns true if the transaction is open.- Specified by:
isOpen
in interfaceTransactionContext
- Returns:
true
if the transaction is open.- See Also:
-
setWaitOnLock
Indicates which lock this transaction is waiting for. When a transaction attempts to acquire a lock it must indicate which lock it attempts to acquire in order to perform dead-lock detection. This method is called byObjectLock
before entering the temporary lock-acquire state.- Specified by:
setWaitOnLock
in interfaceTransactionContext
- Parameters:
lock
- The lock which this transaction attempts to acquire- See Also:
-
getWaitOnLock
Returns the lock which this transaction attempts to acquire.- Specified by:
getWaitOnLock
in interfaceTransactionContext
- Returns:
- The lock which this transaction attempts to acquire
- See Also:
-
isDeleted
Returns true if and only if the specified object is loaded or created in this transaction and is deleted.- Specified by:
isDeleted
in interfaceTransactionContext
- Parameters:
object
- The object to test the state of in this transaction.- Returns:
true
if the object is deleted.- See Also:
-
isDeletedByOID
- Specified by:
isDeletedByOID
in interfaceTransactionContext
- See Also:
-
getClassLoader
Get the current application ClassLoader.- Specified by:
getClassLoader
in interfaceTransactionContext
- Returns:
- the current ClassLoader's instance.
null
if none has been provided - See Also:
-
expireCache
Expire object from the cache. Objects expired from the cache will be read from persistent storage, as opposed to being read from the cache, during subsequent load/query operations.- Specified by:
expireCache
in interfaceTransactionContext
- Parameters:
molder
- The class persistence molder.identity
- The object's identity.- Throws:
PersistenceException
- If identity is null or any problem that happens during expiration of cache values.- See Also:
-
isCached
public final boolean isCached(ClassMolder molder, Class cls, Identity identity) throws PersistenceException - Specified by:
isCached
in interfaceTransactionContext
- Throws:
PersistenceException
- See Also:
-
isReadOnly
Check to see whether this transaction considers an object to have been marked read-only.- Specified by:
isReadOnly
in interfaceTransactionContext
- Parameters:
object
- The object to test for read-only status- Returns:
true
if the object is marked read-only in this transaction; otherwise,false
.- See Also:
-
getDatabase
- Specified by:
getDatabase
in interfaceTransactionContext
- See Also:
-
isLocked
Returns true if the object given is locked.- Specified by:
isLocked
in interfaceTransactionContext
- Parameters:
cls
- Class instance of the object to be investigated.identity
- Identity of the object to be investigated.lockEngine
- Current LcokEngine instance- Returns:
- True if the object in question is locked.
-
getNamedQuery
Creates an OQL query based upon a named query as defined in the mapping file.- Specified by:
getNamedQuery
in interfaceTransactionContext
- Parameters:
molder
- Specific class molder.name
- Name of the (named) query to create.- Returns:
- An OQL query
- Throws:
QueryException
- If the named query can not be found
-
getNamedNativeQuery
public final NamedNativeQuery getNamedNativeQuery(ClassMolder molder, String name) throws QueryException Returns a NamedNativeQuery instance query based upon a named query as defined in the mapping file.- Specified by:
getNamedNativeQuery
in interfaceTransactionContext
- Parameters:
molder
- Specific class molder.name
- Name of the (named) query to create.- Returns:
- A NamedNativeQuery instance.
- Throws:
QueryException
- If the named query can not be found.
-