嵌套事务的目的是什么?

23

我从来不明白嵌套事务有什么用。提交嵌套事务并没有提交任何内容 - 它只是减少了@@TRANCOUNT。而且ROLLBACK会回滚所有的内容。

BEGIN TRANSACTION
   //do an update
   BEGIN TRANSACTION
     //do an insert
   COMMIT TRANSACTION
COMMIT TRANSACTION
这有什么区别:
BEGIN TRANSACTION
     //do an update
     //do an insert
COMMIT TRANSACTION
请给我一个例子,说明为什么应该使用嵌套事务以及它们如何产生差异。
2个回答

17

嵌套事务允许您的代码调用其他代码(例如存储过程),这些代码在提交时不会实际提交的事务。

话虽如此,您仍然可以使用安全点在事务内部回滚。

有一篇CodeProject文章专门讲述此问题。


1
我可以在不使用嵌套事务的情况下使用安全点。存储过程是一个好的点子(我从未想过)。但是,如果我在我的事务中不使用存储过程(或不调用其他代码),为什么我需要嵌套事务呢?我经常看到有关嵌套事务的示例,但我不明白它们的意义所在。 - Petar Minchev
嵌套事务仅在调用外部事务代码时有用吗? - Petar Minchev
1
我同意你的观点,认为它们对于调用外部事务代码非常有用。SQL Server 处理嵌套事务的技术能力很重要,而且并不是所有数据库系统都具备这种能力。在某些情况下(例如在提到的存储过程中 - 您还应该使用 SET XACT_ABORT ON),它们可能会自然地嵌套。我从未使用过显式嵌套事务。 - Lucero
2
另请参见http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/。 - Aaron Bertrand
MSSQL中的存储过程是否会自动启动事务?我的意思是,整个存储过程默认情况下是否具有事务性? - Petar Minchev
显示剩余3条评论

1

如果您遇到这样的情况:在一个存储过程中调用了另一个存储过程,而且内部存储过程也可以从您的应用程序中独立调用。在这种情况下,有必要在内部存储过程和父存储过程上都放置事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接