首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLTransaction和T-SQL事务

SQLTransaction和T-SQL事务
EN

Stack Overflow用户
提问于 2008-12-23 23:21:24
回答 3查看 1.7K关注 0票数 2

我使用的是.NET 2.0和SQL Server2005。由于历史原因,应用程序代码使用SQLTransaction,但一些存储过程也使用T-SQL begin/commit/rollback tran语句。其思想是DBTransaction可以跨越许多存储过程,每个单独的存储过程控制其作用域内发生的事情-实际上这些是嵌套事务。

代码的旧行为是,如果任何SQLTransaction失败,应用程序逻辑也会导致外部sprocs也回滚。但现在我们想要更改逻辑,以便即使出现故障,外部事务也应继续按其顺序执行剩余的SQLTransaction,最后,由于我们知道存在故障,因此我们回滚整个sprocs。

问题是,至少就目前的编码而言,如果任何SQLTransaction执行回滚,外部sprocs似乎会失去连接,因此任何后续重用事务的尝试都会失败。有没有一种方法可以在T-SQL中回滚的同时仍然保持外部SQLTransaction?我在想也许保存点在这里可能会有帮助,但我还不是很了解它们。

使这种情况变得复杂的是,并不总是有一个外部事务,所以我不能简单地删除T-SQL回滚。有时,存储过程是独立执行的;有时是在事务上下文中执行的。

切换到TransactionScope会让事情变得更简单吗?

感谢你的任何suggestions...Mike

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-23 23:44:51

请查看以下知识库条目:

An unexpected exception may occur when a transaction is committed or rolled back after a data source error has occurred

回滚存储过程中的事务将导致ADO.NET客户端中的任何“外部”事务消失。唯一的解决方案是将Rollback()调用包装在try/catch块中。如果发生这种情况,我认为维护外部事务是不可能的。

票数 0
EN

Stack Overflow用户

发布于 2008-12-23 23:55:09

我建议您考虑将外部事务也放在存储过程中,以便在TSQL中维护所有嵌套(使用EXEC调用其他存储过程)。SQL Server是一个极其丰富的开发/数据管理环境,它将允许您以ADO笨拙地处理事务的方式管理事务。还请记住,将一堆SQL组合在一个存储过程中几乎总是比通过ADO连接进行多个调用更有效。

票数 0
EN

Stack Overflow用户

发布于 2008-12-26 06:23:10

您可能有兴趣了解一下IMPLICIT_TRANSACTION,这样您就可以更改存储过程的事务依赖模式。在许多情况下,这是一种更容易的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档