【问题标题】:.NET TransactionScope class and T-SQL TRAN COMMIT and ROLLBACK.NET TransactionScope 类和 T-SQL TRAN COMMIT 和 ROLLBACK
【发布时间】:2010-09-16 09:57:11
【问题描述】:
我目前正在编写一个应用程序,该应用程序需要对我的业务实体进行多次插入、更新和删除。我使用 TransactionScope 类来保证所有存储过程都可以作为单个工作单元提交或回滚。
我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 是我的每个存储过程吗?
【问题讨论】:
标签:
.net
database
tsql
transactions
【解决方案1】:
不,如果将 TransactionScope 用于您的事务,则不需要显式事务 - 但是:重要您可能应该在连接字符串中设置 Transaction Binding=Explicit Unbind;。完整的细节是here,但否则你可能会导致前几个操作被回滚,最后几个提交(或者更确切地说,在任何事务之外运行)。
【解决方案2】:
在 2005 年没有必要,在 2000 年我会,另外,我通常将事务范围放在“使用”块中。
在 2000 和更早版本与 2005 上使用时存在一些性能问题。
见here
谢谢
【解决方案3】:
如果您加入了TransactionScope 或CommittableTransaction,那么我强烈建议您不使用begin transaction 或SqlConnection.BeginTransaction 明确创建自己的本地事务。
TransactionScope/CommittableTransaction 是不同的“家族”,与begin transaction/SqlTransaction 互斥
因此,我不同意赛义夫汗的观点。确实 System.Transactions 在 Sql 2000 上存在性能问题,因此使用 SqlTransaction 或 begin transaction 可能会更好。但是,如果你这样做了,那么你不应该同时使用 TransactionScope/CommittableTransaction。
顺便说一下,Marc Gravell 所描述的行为在 .Net 4.0 中已经改变。即使您不使用 Explicit Unbind,也不再可能回滚一些命令并提交一些命令。 (但是他是正确的,在旧版本中您应该使用 Explicit Unbind)。
【解决方案4】:
您不需要 - 它应该在 TransactionScope 内处理。它确实有点取决于您正在做什么以及您如何处理事务(显式或隐式)更多HERE