c# - .net 中的交易

标签 c# .net transactions

在 C# .Net 2.0 中执行事务的最佳做法是什么。应该使用哪些类?需要注意的陷阱是什么等等。所有这些提交和回滚的东西。我刚刚开始一个项目,我可能需要在将数据插入数据库时​​进行一些交易。欢迎任何有关交易的基本内容的回复或链接。

最佳答案

有两种主要的交易;连接事务和环境事务。连接事务(例如 SqlTransaction)直接绑定(bind)到数据库连接(例如 SqlConnection),这意味着您必须不断传递连接 - 在某些情况下可以,但不允许“创建/使用/释放”用法,并且不允许跨数据库工作。示例(针对空格格式化):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

不是太乱,但仅限于我们的连接“conn”。如果我们想调用不同的方法,我们现在需要传递“conn”。

替代方案是环境事务; .NET 2.0 中的新功能,TransactionScope对象 (System.Transactions.dll) 允许在一系列操作中使用(合适的提供者将自动加入环境事务)。这使得改造现有(非事务性)代码以及与多个提供商对话变得容易(尽管如果您与多个提供商对话,DTC 将参与其中)。

例如:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

请注意,这两种方法可以处理它们自己的连接(打开/使用/关闭/处置),但它们将默默地成为环境事务的一部分,而无需我们传递任何内容。

如果您的代码出错,Dispose() 将在没有 Complete() 的情况下被调用,因此它会被回滚。支持预期的嵌套等,尽管您不能回滚内部事务但仍完成外部事务:如果有人不满意,事务将中止。

TransactionScope 的另一个优点是它不仅仅与数据库相关;任何交易感知提供者都可以使用它。以 WCF 为例。或者甚至有一些与 TransactionScope 兼容的对象模型(即具有回滚功能的 .NET 类 - 也许比纪念品更容易,尽管我自己从未使用过这种方法)。

总而言之,一个非常非常有用的对象。

一些注意事项:

  • 在 SQL Server 2000 上,TransactionScope 将立即转到 DTC;这在 SQL Server 2005 及更高版本中已修复,它可以使用 LTM(开销少得多)直到您与 2 个源等对话,当它被提升为 DTC 时。
  • 有一个glitch这意味着您可能需要调整连接字符串

关于c# - .net 中的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224689/

相关文章:

c# - 为什么 WebClient.OpenRead 在 Windows Server 2008 R2 上超时

c# - 在大型 csv 文件 C# 中搜索字符串的更快方法

ios - Swift iOS - 如何将计时器放在 Firebase TransactionBlock 上以防止它在特定时间段内增加

spring - Ehcache本地事务与Spring @Transactional

Mysql 提交有时需要几分钟才能完成

c# - 从不同程序集中反序列化具有相同名称的类

c# - 处理不完整或错误的远程注销

javascript - 将 Angular 4 升级到 5 后,Api 无法工作并抛出控制台错误

c# - 如何有效地管理对 Membership.GetUser() 的多次调用

.net - 包含 XML 的 T4 模板导致解析错误