ROLLBACK TRAN会回滚一切吗?

时间:2013-03-05 17:41:11

标签: sql sql-server tsql

ROLLBACK TRAN会回滚SP中的所有内容吗? (包括对另一个SP的呼叫)

示例:

BEGIN TRAN

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

  EXEC InsertTable2

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

ROLLBACK TRAN

4 个答案:

答案 0 :(得分:5)

来自msdn

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

所以是

答案 1 :(得分: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

但假设一个明智的定义,答案是“是”

答案 2 :(得分:2)

  

ROLLBACK TRAN会滚动一切吗?

ROLLBACK语句不会撤消所有内容。 例如:

CREATE TABLE CocoJambo1 (Col1 INT);
DECLARE @CocoJambo2 TABLE(Col1 INT);

BEGIN TRANSACTION;

INSERT INTO CocoJambo1 (Col1) VALUES (123);
INSERT INTO @CocoJambo2 (Col1) VALUES (123);

ROLLBACK TRANSACTION;

PRINT 'CocoJambo1 ...'
SELECT * FROM CocoJambo1;
PRINT '@CocoJambo2 ...'
SELECT * FROM @CocoJambo2;

结果:

CocoJambo1 ...
Col1
-----------
(0 row(s) affected)

@CocoJambo2 ...
Col1
-----------
123
(1 row(s) affected)

答案 3 :(得分:0)

是。它会ROLLBACK Store Procedure中您提到的所有内容。

更多关于ROLLBACK TRANSACTION