ADO.NET重试一个sql连接内的事务
问题描述:
我尝试使用ADO.NET和事务实现简单的重试逻辑。 的代码示例:ADO.NET重试一个sql连接内的事务
using(SqlConnection conn = new SqlConnection(m_connection))
{
conn.Open();
bool committed = false;
Exception exception = null;
for (int i = 0; i < s_attempts; i++)
{
SqlTransaction tran = conn.BeginTransaction();
try
{
// different commands here..
tran.Commit();
committed = true;
break;
}
catch (Exception ex)
{
exception = ex;
tran.Rollback();
}
}
if (!committed && exception != null)
{
throw exception;
}
}
是否还好一个连接中创建另一个事务的前一个被rollbacked后?
预先感谢您!
答
如果所有的事务都被提交或回滚,没有理由不能在同一个连接上继续创建事务。
我会质疑为什么第一次尝试失败,但我假设你会在每次提交事务的尝试之间放置一些延迟(可能递增)。
+0
在大多数情况下,它可以避免发生很少的死锁。我以同样的方式思考,但并不完全确定。谢谢你的回答! –
@Anderi,它取决于目的,如果一个事务对另一个事务是不相关的,那么这两个事务必须处于单个提交中,否则更好地松散地耦合它们。 –
@HameedSyed,在try部分我想每次调用相同的逻辑。有时它会崩溃(例如死锁),我想要回滚已经完成的操作,并在新事务中再次重试相同的命令。据我的理解,我可以做到。谢谢! –