/// <summary> /// Releases a mutex on the DB server. /// </summary> /// <param name="lockName">Unique name for the lock</param> /// <param name="owner">The owner of the lock. Partial support in different db servers.</param> /// <param name="dbPrincipal">The user that has permissions to the lock.</param> /// <returns><value>true</value> if the lock was release, <value>false</value> if failed, not exists or timed out.</returns> public virtual bool ReleaseLock(string lockName, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { throw new NotImplementedException(@"ReleaseLock"); }
/// <summary> /// Creates a mutex on the DB server. /// </summary> /// <param name="lockName">Unique name for the lock</param> /// <param name="owner">The owner of the lock. Partial support in different db servers.</param> /// <param name="timeout">Timeout</param> /// <param name="dbPrincipal">The user that has permissions to the lock.</param> /// <returns><value>true</value> if the lock was acquired, <value>false</value> if failed or timed out.</returns> public virtual bool GetLock(string lockName, TimeSpan timeout, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { throw new NotImplementedException(@"GetLock"); }
public override bool ReleaseLock(string lockName, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { string ownerString = "Session"; switch (owner) { case SqlMutexOwner.Transaction: ownerString = "Transaction"; break; } SqlCommand sqlCommand = new SqlCommand("sp_releaseapplock", _Connection); sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.Parameters.AddWithValue("Resource", lockName); sqlCommand.Parameters.AddWithValue("LockOwner", ownerString); sqlCommand.Parameters.AddWithValue("DbPrincipal", dbPrincipal ?? "public"); SqlParameter returnValue = sqlCommand.Parameters.Add("ReturnValue", SqlDbType.Int); returnValue.Direction = ParameterDirection.ReturnValue; sqlCommand.ExecuteNonQuery(); if (Convert.ToInt32(returnValue.Value) < 0) { return false; } return true; }
public override bool GetLock(string lockName, TimeSpan timeout, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { string ownerString = "Session"; switch (owner) { case SqlMutexOwner.Transaction: ownerString = "Transaction"; break; } SqlCommand sqlCommand = new SqlCommand("sp_getapplock", _Connection); sqlCommand.CommandType = CommandType.StoredProcedure; sqlCommand.CommandTimeout = (int)Math.Ceiling(timeout.TotalSeconds); sqlCommand.Parameters.AddWithValue("Resource", lockName); sqlCommand.Parameters.AddWithValue("LockOwner", ownerString); sqlCommand.Parameters.AddWithValue("LockMode", "Exclusive"); sqlCommand.Parameters.AddWithValue("LockTimeout", (Int32)timeout.TotalMilliseconds); sqlCommand.Parameters.AddWithValue("DbPrincipal", dbPrincipal ?? "public"); SqlParameter returnValue = sqlCommand.Parameters.Add("ReturnValue", SqlDbType.Int); returnValue.Direction = ParameterDirection.ReturnValue; sqlCommand.ExecuteNonQuery(); if (Convert.ToInt32(returnValue.Value) < 0) { return false; } return true; }
public override bool ReleaseLock(string lockName, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { object sqlLock = ExecuteScalar(@"SELECT RELEASE_LOCK('" + EscapeString(lockName) + "')"); if (sqlLock == null || sqlLock == DBNull.Value || (sqlLock is System.Data.SqlTypes.INullable && ((System.Data.SqlTypes.INullable)sqlLock).IsNull) || Convert.ToInt32(sqlLock) != 1) { return false; } return true; }
public override bool GetLock(string lockName, TimeSpan timeout, SqlMutexOwner owner = SqlMutexOwner.Session, string dbPrincipal = null) { object sqlLock = ExecuteScalar(string.Format("SELECT GET_LOCK('{0}', {1})", EscapeString(lockName), (timeout == TimeSpan.MaxValue ? "-1" : timeout.TotalSeconds.ToString(CultureInfo.InvariantCulture)))); if (sqlLock == null || sqlLock == DBNull.Value || (sqlLock is System.Data.SqlTypes.INullable && ((System.Data.SqlTypes.INullable)sqlLock).IsNull) || Convert.ToInt32(sqlLock) != 1) { return false; } return true; }