【发布时间】:2012-02-13 09:11:58
【问题描述】:
我有这样的代码:
try
{
using (TransactionScope scope = new TransactionScope())
{
some_db_function();
for (i = 0; i < 10; i++)
{
some_other_db_function();
}
scope.Complete();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + " all done transactions will rollback");
}
在 db 函数内部会发生这样的事情:
private void some_db_functions()
{
using (TransactionScope scope = new TransactionScope())
{
//some processing on db
scope.Complete();
}
}
应该是数据库事务出现问题,比如函数插入或更新出错;到目前为止已完成的所有事务都会回滚。但它不是那样工作的;尽管它抛出了一个异常并且父函数中的scope.Complete() 永远不会被触发,但仍然没有回滚。
问题出在哪里?
【问题讨论】:
-
你只是不需要使用 scope.Complete() ,在 using 语句中使用 Transaction 范围可以处理所有事情。
-
您的数据库方法是打开连接还是使用现有连接?
-
它没有。即使没有 scope.Complete() 它也不能正常工作。
-
它们都使用相同的连接,之前声明过。
-
@Flowerking 不,您在成功场景结束时明确需要
Complete()。如果你不调用Complete(),它总是在Dispose()期间回滚(通常通过using)
标签: c# transactionscope