回滚事务是否会回滚所有操作?

3
< p>使用ROLLBACK TRAN会回滚存储过程中的所有内容吗?(包括调用其他存储过程)

示例:

BEGIN TRAN

  INSERT INTO (table1)
  VALUES (1,'abc')

  EXEC InsertTable2

  INSERT INTO (table3)
  VALUES (1,'abc')

ROLLBACK TRAN

2
当然可以!回滚将撤销自“BEGIN TRAN”以来的所有数据操作,这正是事务的全部意义所在... - marc_s
1
@marc_s:除非存储过程内有DDL语句,否则我不确定在应用于各种DDL命令时ROLLBACK的范围是什么。 - Jon Egerton
@marc_s:至少在SQL Server中,提交不会提交所有内容。它只是减少了“事务计数器”。只有当它为零时,才是一个“真正”的提交。不确定回滚是否行为相同。因此,如果存储过程内有另一个start transaction,情况可能会有所不同。 - user330315
2
@a_horse_with_no_name 如果我没记错的话,ROLLBACK 命令会忽略嵌套事务。如果你遇到了一个回滚操作,它不仅会回滚最内层的事务,而且会一直回滚到 trancount 0 - Jeff Rosenberg
此外,如果存储过程启动了事务但没有提交或回滚,则需要用尺子打击某些开发人员的手腕。 - Aaron Bertrand
3个回答

5

从MSDN

回滚显式或隐式事务到事务的开始或事务中的保存点。您可以使用ROLLBACK TRANSACTION来擦除从事务开始或保存点以来所做的所有数据修改。它还释放事务持有的资源。

因此,是的。


3

如果不知道InsertTable2的定义,就无法确定。以下是一个例子,其中并没有使用它。

CREATE TABLE table1
(
Num int,
String char(3)
)
GO

CREATE PROC InsertTable2
AS
COMMIT;
BEGIN TRAN;

GO


BEGIN TRAN

  INSERT INTO table1
  VALUES (1,'abc')

  EXEC InsertTable2

  INSERT INTO table1
  VALUES (1,'abc')

ROLLBACK TRAN

GO

SELECT *
FROM table1

GO

DROP TABLE table1

DROP PROC InsertTable2

但是如果假定一个合理的定义,答案就是“是的”。

1
简单明了。我将把这个例子命名为“事务注入”。 - Bogdan Sahlean

0

是的。它将会回滚你上述提到的存储过程中的所有内容。

更多关于回滚事务的信息。


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