TransactionScope与LINQ to SQL中的事务

LINQ到SQL的经典事务模式有什么区别?

using(var context = Domain.Instance.GetContext()) { try { context.Connection.Open(); context.Transaction = context.Connection.BeginTransaction(); /*code*/ context.Transaction.Commit(); } catch { context.Transaction.Rollback(); } } 

与TransactionScope对象

 using (var context = Domain.Instance.GetContext()) using (var scope = new TransactionScope()) { try { /*code*/ scope.Complete(); } catch { } } 

Linq2SQL将使用隐式事务。 如果您的所有更新都是在一个提交中完成的,则您可能无需自行处理该交易。

从文档(重点是我的):

当您调用SubmitChanges时,LINQ to SQL将检查调用是否在事务的范围内,或者是否将事务属性(IDbTransaction)设置为用户启动的本地事务。 如果它找不到事务,则LINQ to SQL启动一个本地事务(IDbTransaction)并使用它来执行生成的SQL命令。 当所有的SQL命令都成功完成后,LINQ to SQL提交本地事务并返回。

应该注意的是,在使用TransactionScope ,不需要try/catch结构。 您只需在范围中调用Complete就可以在范围退出时提交事务。

也就是说, TransactionScope通常是一个更好的select,因为它允许您将调用嵌套到可能需要事务的其他方法,而不必传递事务状态。

DbConnection对象上调用BeginTransaction时,如果要在同一个事务中执行其他操作,则必须传递该事务对象,但使用其他方法。

使用TransactionScope ,只要范围存在,它就会处理在线程上注册到当前Transaction所有东西,使代码更清洁,更易于维护。

最重要的是,您还可以使用其他可以参与事务的资源,而不仅仅是连接到数据库。

应该注意的是,在您需要充分利用连接和数据库操作的情况下,您可能不想使用TransactionScope ; 即使是针对单个数据库,也可以运行分布式事务协调器,并将事务转换为分布式事务(即使是单个数据库连接)。

在这些情况下,当您的devise混淆时,您可能需要考虑传递特定于连接的事务。

或者 ,如果您知道您将一致地使用一个资源(并在同一个线程上),则可能需要创build一个引用计数您的连接/事务的类。

你会创build一个在build设,创build你的资源/增加计数的类。 它还将实现IDisposable (在计数为零时,将递减/释放/提交/放弃),并将计数存储在应用了ThreadStaticAttribute的variables中。

这使您可以将事务pipe理从逻辑代码中分离出来,并且仍然可以高效地保持单一资源(而不是升级到分布式事务)。

一个很大的区别(经验教训很难) – TransactionScope使用MS DTC进行事务pipe理。

如果您的应用程序只能pipe理数据库事务,并且不涉及服务或远程调用,则可以使用数据库本机事务(DbTransactions)跳过与MS DTC相关的潜在问题。

我相信它们基本上是相同的,TransactionScope类将与ADO.NET底层连接进行接口来创build并提交或回滚事务。 TransactionScope类只是为了使用ADO.NET持久性清理器而创build的。

编辑:澄清我的声明,关于casperOne的另外它是TransactionScope将创build交易,然后连接将看到由TransactionScope创build的交易,并使用它,因为它是可用的。

TransactionScope为所有资源pipe理器(SQL服务器,活动目录,文件系统等)提供统一pipe理。 而且,可以编写自己的资源pipe理器:检测事务范围的代码,joinSQL Server并像SQL Server一样工作:像其他事务参与者一样提交或还原更改。 我相信,TransactionScope是主stream,忘记MS SQL本地事务,直到失败陷入巨大的陷阱: Windows Server 2008的WEB版带有限制的分布式事务处理协调器服务和事务范围只适用于一台计算机。 如果IIS和SQL服务器安装在不同的计算机上,您的ASP.NET应用程序将在此系统上失败。 考虑到大多数公共领域提供商提供的Windows Server WEB版本和SQL服务器在不同的服务器上。 这意味着,您必须使用显式事务pipe理来处理本地事务。