我正在使用Polly来实现对瞬态SQL错误的重试策略。问题在于我需要将我的db调用包装在一个事务中(因为如果有任何一个失败,我想回滚)。在实现Polly之前,这很容易,因为我只需捕获异常并回滚即可。但是,现在我正在使用下面的代码来实现Polly并进行几次重试。问题在于,当我有一个异常并且Polly执行重试时,假设重试不起作用并且所有尝试均失败,则事务会保持打开状态,并且我会收到错误消息,指出“无法在事务中开始事务”。我知道为什么会发生这种情况,因为
问题是,当我有一个事务并且需要在每次失败后回滚时,如何实现Polly,以便即使在最后一次失败时它仍然被回滚?
以下是我目前所做的事情:
.WaitAndRetry
将在每次尝试之前执行块中的代码。这就是我现在进行回滚的地方。这适用于除最后一个尝试外的所有尝试。问题是,当我有一个事务并且需要在每次失败后回滚时,如何实现Polly,以便即使在最后一次失败时它仍然被回滚?
以下是我目前所做的事情:
return Policy
.Handle<SQLiteException>()
.WaitAndRetry(retryCount: 2, sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), onRetry: (exception, retryCount, context) =>
{
connection.Rollback();
Logger.Instance.WriteLog<DataAccess>($"Retry {retryCount} of inserting employee files", LogLevel.Error, exception);
})
.Execute(() =>
{
connection.BeginTransaction();
connection.Update(batch);
connection.Insert(pkgs);
if (pkgStatus != null)
connection.Insert(pkgStatus);
if (extended != null)
connection.Insert(extended);
connection.Commit();
return true;
});