我目前正在编写一个应用程序,该应用程序需要对我的业务实体进行多次插入、更新和删除。我使用 TransactionScope 类来保证所有存储过程都可以作为单个工作单元提交或回滚。
我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 是我的每个存储过程吗?
我目前正在编写一个应用程序,该应用程序需要对我的业务实体进行多次插入、更新和删除。我使用 TransactionScope 类来保证所有存储过程都可以作为单个工作单元提交或回滚。
我的问题是,如果我在 .NET 类库中使用 TransactionScope 类,我还需要使用 COMMIT TRAN 和 ROLLBACK TRAN 是我的每个存储过程吗?
不,如果将 TransactionScope 用于您的事务,则不需要显式事务 - 但是:重要的是,您可能应该Transaction Binding=Explicit Unbind;
在连接字符串中设置。完整的细节在这里,但否则你最终可能会回滚前几个操作,最后几个提交(或者更确切地说,在任何事务之外运行)。
如果您参加了TransactionScope
orCommittableTransaction
那么我强烈建议您不要使用begin transaction
or明确创建自己的本地事务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)。
您不需要 - 它应该在 TransactionScope 内处理。它确实有点取决于您正在做什么以及您如何处理事务(显式或隐式)更多在这里