public bool GetScheduleEnqueueingLock(long scheduleId, DateTime forceIfOlderThan, IDbTransaction transaction)
{
const string SelectSql =
@"SELECT [Enqueueing], [EnqueueingUpdatedOn]
FROM [BlueCollarSchedule]
WHERE
[Id] = @Id;";
const string UpdateSql =
@"UPDATE [BlueCollarSchedule]
SET
[Enqueueing] = @Enqueueing,
[EnqueueingUpdatedOn] = @EnqueueingUpdatedOn
WHERE
[Id] = @Id;";
bool obtained = false, commitRollback = false;
if (transaction == null)
{
transaction = this.BeginTransaction(IsolationLevel.Serializable);
commitRollback = true;
}
try
{
EnqueueingRecord enqueueing = this.connection.Query<EnqueueingRecord>(
SelectSql,
new { Id = scheduleId },
transaction,
true,
null,
null).First();
if (!enqueueing.Enqueueing || enqueueing.EnqueueingUpdatedOn == null || enqueueing.EnqueueingUpdatedOn <= forceIfOlderThan)
{
obtained = true;
this.connection.Execute(
UpdateSql,
new { Id = scheduleId, Enqueueing = true, EnqueueingUpdatedOn = DateTime.UtcNow },
transaction,
null,
null);
}
if (commitRollback)
{
transaction.Commit();
}
}
catch
{
if (commitRollback)
{
transaction.Rollback();
}
throw;
}
return obtained;
}