我有这样的一段代码:
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");
}
在数据库函数内部,类似这样的操作会发生:
private void some_db_functions()
{
using (TransactionScope scope = new TransactionScope())
{
//some processing on db
scope.Complete();
}
}
根据预期,如果数据库事务中出现任何问题,例如在函数中插入或更新时发生错误,则到目前为止已完成的所有事务都会被回滚。但实际情况并非如此;尽管它抛出异常且父函数中的scope.Complete()
从未被触发,但仍然没有任何事务被回滚。
问题出在哪里?
Complete()
。如果你不调用Complete()
,它总是会在Dispose()
(通常通过using
)中回滚。 - Marc Gravell