我目前正在编写一个应用程序,该应用程序需要为我的业务实体进行多次插入、更新和删除。 我正在使用 TransactionScope 类来保证所有存储过程都可以作为单个工作单元提交或回滚。
我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 是我的每个存储过程?
不,如果使用事务范围进行事务,则不需要显式事务 - 但是:重要的是,您可能应该在连接字符串中设置Transaction Binding=Explicit Unbind;
。完整的详细信息在这里,但否则你最终可能会回滚前几个操作,最后几个提交(或者更确切地说,在任何事务之外运行)。
> 在 2005 年没有必要,在 2000 年我会,而且,我通常将事务范围放在"using"块中。
在 2000 及更早版本与 2005 年之间使用它时存在一些性能问题。
看这里
谢谢
加入了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 中已更改。即使不使用显式取消绑定,也不再可能回滚某些命令并提交某些命令。(但是他是正确的,在旧版本中您应该使用显式取消绑定)。
你不需要 - 它应该在事务范围内处理。它确实取决于你在做什么以及你如何处理交易(显式或隐式) 更多 这里