在C#.NET2.0中处理事务的最佳实践是什么.应该使用哪些类?需要注意的trap 是什么,等等.所有提交和回滚的东西.我刚刚开始一个项目,在该项目中,我可能需要在将数据插入数据库时执行一些事务.欢迎任何关于交易的基本信息的回复或链接.

推荐答案

有两种主要的交易类型;连接事务和环境事务.连接事务(比如SqlTransaction)直接绑定到db连接(比如SqlConnection),这意味着必须不断传递连接——在某些情况下是可以的,但不允许"创建/使用/发布"使用,也不允许跨db工作.示例(格式为空格):

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

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

另一种 Select 是环境事务;新来的.NET 2.0,TransactionScope对象(System.Transactions.dll)允许在一系列操作中使用(合适的提供程序将自动在环境事务中登记).这使得它很容易恢复到现有(非事务性)代码中,并与多个Provider 交谈(尽管如果您与多个Provider 交谈,DTC将参与其中).

例如:

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

请注意,这两个方法可以处理它们自己的连接(open/use/close/dispose),但它们将悄悄地成为环境事务的一部分,而无需我们传入任何内容.

如果您的代码出错,将调用Dispose()而不调用Complete(),因此它将被回滚.支持预期的嵌套ETC,尽管您不能回滚内部事务,也不能完成外部事务:如果任何人不满意,事务就会中止.

TransactionScope的另一个优点是,它不仅与数据库相关;任何事务感知Provider 都可以使用它.比如WCF.甚至还有一些TransactionScope兼容的对象模型(例如,具有回滚功能的NET类——可能比memento更容易,尽管我自己从未使用过这种方法).

总而言之,这是一个非常非常有用的东西.

一些注意事项:

  • 在SQL Server 2000上,TransactionScope将立即转到DTC;这在SQL Server 2005及更高版本中是固定的,它可以使用LTM(开销要小得多),直到您与2个源等通信时,它被提升为DTC.
  • 有一个glitch,这意味着你可能需要调整你的连接字符串

.net相关问答推荐

将Visual Studio更新到v17.9.3后,IDE关闭,dotnet.exe命令报告致命错误.内部CLR错误.(0x80131506)

如何在 .net MAUI 中删除不需要编译的平台?

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

使用 PostAsJsonAsync C# 时出现错误请求

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

为什么 .NET 内部 Hashtable 中有一个 Thread.Sleep(1)?

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

使用 IIS Express 托管网站(临时)

OpenCV的.Net(dotNet)包装器?

编译错误:显式实现接口时修饰符 'public' 对此项目无效

处理序列没有元素异常

使用 C# 在 .NET 4.0 中 Task.Run 的替代方法是什么?

找不到 Assert.Fail 和 Assert.Pass 或等效项

无法将文件 *.mdf 作为数据库附加

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

MemoryStream.Close() 或 MemoryStream.Dispose()

如何在 C# 中安全地将 System.Object 转换为bool?

文件按文件名模式存在

log4net的正确使用方法(记录器命名)

通过反射获取公共静态字段的值