朋友们,我有一个关于围绕 SQL 命令执行实现简单重试策略的问题。
我的问题是:重试循环应该封装连接和事务的构造,还是应该存在于连接内部。
例如:
private void RetryLogSave(DynamicParameters parameters, int retries = 3)
{
int tries = 0;
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
var logItemCommand = new CommandDefinition(commandText: Constants.InsertLogItem,
parameters: parameters, transaction: transaction, commandType: System.Data.CommandType.Text);
do
{
try
{
tries++;
connection.Execute(logItemCommand);
transaction.Commit();
break;
}
catch (Exception exc)
{
if (tries == retries)
{
transaction.Rollback();
throw exc;
}
Task.Delay(100 * tries).Wait();
}
}
while (true);
}
}
}
我在这里所做的是否合适且可以接受,或者重试逻辑是否应该存在于 SqlConnection 构造之外?