4

我有一个问题 - 是否可以使用 using( 块和 TransactionScope 在 C# 端创建逻辑,在 sql 服务器上执行多个非查询,并在失败时回滚所有存储过程?

约束:我无法创建更大的存储过程来执行 TSQL 事务中的其他存储过程。

- 存储过程中没有“提交”,只有返回 0;在末尾。

这是否意味着如果事务失败/超时/我没有点击 transaction.Complete(),它们可以自动回滚?我是否需要将 ROLLBACK 插入到存储过程中才能实现此功能?

我已经努力搜索,但我无法找到这个有点独特的问题的确切答案。感谢您的时间。如果有人有任何可能的测试让我执行尝试,我会非常愿意。

4

1 回答 1

6

是的,ADO.NET 采用了 TransactionScope。如果你捕捉到任何异常并调用 .Rollback(),一切都会被回滚。

它的工作方式有很多细节(例如 MSDTC 可以参与),但你的建议是完全有效的,并且是做你想做的事情的正确方法。

同样的事情也适用于支持 TransactionScope 的 Oracle 和其他数据库。您还可以通过 WCF 服务传递事务,如果使用更多 DB,它们将成为事务的一部分,依此类推。

通过一些低级工作,您甚至可以在事务中包含 NTFS 操作。对于 NTFS,Windows API 支持它,但不支持没有包装器的 .NET。

于 2013-06-24T22:52:52.470 回答