我知道并不是所有提供者都可以保证隐式回滚(通常在发生异常并调用Dispose时发生)。但是,许多示例使用:

using (DbTransactio txn = cnctn.BeginTransaction())

有什么理由吗?

最佳答案

最简单的答案是“因为它实现了IDisposable”。任何实现IDisposable的类型:适本地处理它是您的工作。在这种情况下,使用过程代码,最简单的方法是通过using语句。

在这种特定情况下,答案将是:因为在发生错误的情况下,您希望事务回滚而不是留给GC。我个人可能会倾向于使用catchRollback,但是应该希望Dispose()已经做到了。但是,除非有文档记录,否则我不会自己依赖它。例如:

using(var tran = conn.BeginTransaction()) {
    try {
        // do stuff...
        tran.Commit();
    } catch {
        tran.Rollback();
        throw;
    }
}

请注意,在相关的TransactionScope情况下,“无需标记为完成的Dispose()”是发出回滚信号的预期方式:
using(var tran = new TransactionScope()) {
    // do stuff...
    tran.Complete();
}

关于c# - 为什么在ADO.NET/C#中对DbTransaction使用using语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14519596/

10-12 12:44
查看更多