存储过程中的事务不回滚

时间:2015-01-23 06:39:55

标签: sql sql-server tsql stored-procedures transactions

我有两个选项存储过程sp_Insert,例如。 INSERT INTO Table1INSERT INTO Table2

我已声明3个变量@choice(可以是123),@insertDataToTable1@insertDataToTable2作为输入。

所以代码结构如下:

CREATE PROC sp_MyProc
@choice... 
@insertDataToTable1...
@insertDataToTable2...
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3) 
BEGIN
   BEGIN TRY
      //my query to insert to Table 1
   END TRY
   BEGIN CATCH
      // print error
      ROLLBACK //should rollback transaction
      RETURN
   END CATCH
END
ELSE IF (@choice = 2 OR @choice = 3)
BEGIN
   BEGIN TRY
      //my query to insert to Table 1
   END TRY
   BEGIN CATCH
      // print error
      ROLLBACK //should rollback transaction
      RETURN
   END CATCH
END
COMMIT

所以如果@choice = 1比仅运行第一个查询(instert to table1),如果@choice = 2只运行第二个查询(inster到第二个表),如果@choice = 3运行第一个和第二个查询将数据库插入第1和第2表。

问题:

除了交易问题外,一切都会好的。如果其中一个块失败,交易不回滚。我的意思是如果第一个查询是succssful(插入数据到table1)和第二个查询失败(例如主键问题)它没有回滚,值保持插入到table1。问题在哪里?

1 个答案:

答案 0 :(得分:0)

即使你做@choice = 3也不会满足这两个条件,因为你在第二个条件下有ELSE IF。当你使@choice = 3时,第一个IF将为真,它不会进入ELSE。如果你想转到第二部分,请将ELSE IF改为IF。

CREATE TABLE a (a int)
GO

CREATE PROC sp_MyProc
@choice int
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3) 
BEGIN
   BEGIN TRY
      INSERT INTO a VALUES (1);
   END TRY
   BEGIN CATCH
      PRINT 'WAS HERE'
      ROLLBACK 
      RETURN
   END CATCH
END
IF (@choice = 2 OR @choice = 3)
BEGIN
   BEGIN TRY
      INSERT INTO a VALUES ('a');
   END TRY
   BEGIN CATCH
      PRINT 'WAS HERE 2'
      ROLLBACK 
      RETURN
   END CATCH
END
COMMIT
GO
EXEC sp_MyProc 3
GO
SELECT * FROM a
GO
DROP TABLE a;
GO
DROP PROC sp_MyProc
GO