/// <summary> /// Execute the given callback having optionally aquired the given lock. /// Because CMT assumes that the connection is already part of a managed /// transaction, it does not attempt to commit or rollback the /// enclosing transaction. /// </summary> /// <seealso cref="JobStoreSupport.ExecuteInNonManagedTXLock(string, JobStoreSupport.ITransactionCallback)" /> /// <seealso cref="JobStoreTX.ExecuteInLock(String, JobStoreSupport.ITransactionCallback)" /> /// <seealso cref="JobStoreSupport.GetNonManagedTXConnection()" /> /// <seealso cref="JobStoreSupport.GetConnection()" /> /// <param name="lockName"> /// The name of the lock to aquire, for example /// "TRIGGER_ACCESS". If null, then no lock is aquired, but the /// txCallback is still executed in a transaction. /// </param> /// <param name="txCallback">Callback to execute.</param> protected override object ExecuteInLock( string lockName, ITransactionCallback txCallback) { bool transOwner = false; ConnectionAndTransactionHolder conn = null; try { if (lockName != null) { // If we aren't using db locks, then delay getting DB connection // until after aquiring the lock since it isn't needed. if (LockHandler.RequiresConnection) { conn = GetNonManagedTXConnection(); } transOwner = LockHandler.ObtainLock(DbMetadata, conn, lockName); } if (conn == null) { conn = GetNonManagedTXConnection(); } return(txCallback.Execute(conn)); } finally { try { ReleaseLock(conn, LockTriggerAccess, transOwner); } finally { CleanupConnection(conn); } } }
/// <summary> /// Execute the given callback having optionally aquired the given lock. /// Because CMT assumes that the connection is already part of a managed /// transaction, it does not attempt to commit or rollback the /// enclosing transaction. /// </summary> /// <seealso cref="JobStoreSupport.ExecuteInNonManagedTXLock(string, JobStoreSupport.ITransactionCallback)" /> /// <seealso cref="JobStoreTX.ExecuteInLock(String, JobStoreSupport.ITransactionCallback)" /> /// <seealso cref="JobStoreSupport.GetNonManagedTXConnection()" /> /// <seealso cref="JobStoreSupport.GetConnection()" /> /// <param name="lockName"> /// The name of the lock to aquire, for example /// "TRIGGER_ACCESS". If null, then no lock is aquired, but the /// txCallback is still executed in a transaction. /// </param> /// <param name="txCallback">Callback to execute.</param> protected override object ExecuteInLock( string lockName, ITransactionCallback txCallback) { bool transOwner = false; ConnectionAndTransactionHolder conn = null; try { if (lockName != null) { // If we aren't using db locks, then delay getting DB connection // until after aquiring the lock since it isn't needed. if (LockHandler.RequiresConnection) { conn = GetNonManagedTXConnection(); } transOwner = LockHandler.ObtainLock(DbMetadata, conn, lockName); } if (conn == null) { conn = GetNonManagedTXConnection(); } return txCallback.Execute(conn); } finally { try { ReleaseLock(conn, LockTriggerAccess, transOwner); } finally { CleanupConnection(conn); } } }
/// <summary> /// Execute the given callback having optionally aquired the given lock. /// This uses the non-managed transaction connection. /// </summary> /// <param name="lockName"> /// The name of the lock to aquire, for example /// "TRIGGER_ACCESS". If null, then no lock is aquired, but the /// lockCallback is still executed in a non-managed transaction. /// </param> protected object ExecuteInNonManagedTXLock(string lockName, ITransactionCallback txCallback) { bool transOwner = false; ConnectionAndTransactionHolder conn = null; try { if (lockName != null) { // If we aren't using db locks, then delay getting DB connection // until after aquiring the lock since it isn't needed. if (LockHandler.RequiresConnection) { conn = GetNonManagedTXConnection(); } transOwner = LockHandler.ObtainLock(DbProvider.Metadata, conn, lockName); } if (conn == null) { conn = GetNonManagedTXConnection(); } object result = txCallback.Execute(conn); CommitConnection(conn, false); return result; } catch (JobPersistenceException) { RollbackConnection(conn); throw; } catch (Exception e) { RollbackConnection(conn); throw new JobPersistenceException("Unexpected runtime exception: " + e.Message, e); } finally { try { ReleaseLock(conn, lockName, transOwner); } finally { CleanupConnection(conn); } } }