/// <summary> /// Execute the given callback having optionally acquired 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" /> /// <seealso cref="JobStoreSupport.ExecuteInLock" /> /// <seealso cref="JobStoreSupport.GetNonManagedTXConnection()" /> /// <seealso cref="JobStoreSupport.GetConnection()" /> /// <param name="lockName"> /// The name of the lock to acquire, for example /// "TRIGGER_ACCESS". If null, then no lock is acquired, but the /// txCallback is still executed in a transaction. /// </param> /// <param name="txCallback">Callback to execute.</param> /// <param name="cancellationToken">The cancellation instruction.</param> protected override async Task <T> ExecuteInLock <T>( string lockName, Func <ConnectionAndTransactionHolder, Task <T> > txCallback, CancellationToken cancellationToken = default) { bool transOwner = false; ConnectionAndTransactionHolder conn = null; Guid requestorId = Guid.NewGuid(); try { if (lockName != null) { // If we aren't using db locks, then delay getting DB connection // until after acquiring the lock since it isn't needed. if (LockHandler.RequiresConnection) { conn = GetNonManagedTXConnection(); } transOwner = await LockHandler.ObtainLock(requestorId, conn, lockName, cancellationToken).ConfigureAwait(false); } if (conn == null) { conn = GetNonManagedTXConnection(); } return(await txCallback(conn).ConfigureAwait(false)); } finally { try { await ReleaseLock(requestorId, lockName, transOwner, cancellationToken).ConfigureAwait(false); } finally { CleanupConnection(conn); } } }
/// <summary> /// Execute the given callback having optionally acquired 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,System.Func{Quartz.Impl.AdoJobStore.ConnectionAndTransactionHolder,object})" /> /// <seealso cref="JobStoreTX.ExecuteInLock(string,System.Func{Quartz.Impl.AdoJobStore.ConnectionAndTransactionHolder,object})" /> /// <seealso cref="JobStoreSupport.GetNonManagedTXConnection()" /> /// <seealso cref="JobStoreSupport.GetConnection()" /> /// <param name="lockName"> /// The name of the lock to acquire, for example /// "TRIGGER_ACCESS". If null, then no lock is acquired, but the /// txCallback is still executed in a transaction. /// </param> /// <param name="txCallback">Callback to execute.</param> protected override object ExecuteInLock( string lockName, Func <ConnectionAndTransactionHolder, object> 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 acquiring 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(conn)); } finally { try { ReleaseLock(LockTriggerAccess, transOwner); } finally { CleanupConnection(conn); } } }