簡體   English   中英

存儲過程中的事務不會回滾

[英]Transaction in stored procedure not rolling back

我已經存儲了帶有2個選項的sp_Insert過程。 INSERT INTO Table1INSERT INTO Table1 INSERT 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不是僅運行第一個查詢(插入到table1),如果@choice = 2只能運行第二查詢(插入到第二個表),如果@choice = 3運行第一和第二查詢,則將@choice = 3插入到第一和第二查詢。第二張桌子。

問題:

一切都很好,除了交易問題。 如果其中一個塊失敗,則事務不會回滾 我的意思是,如果第一個查詢成功(將數據插入到table1中),而第二個查詢失敗(例如主鍵問題),它不會回滾,則將值保留插入到table1中。 問題出在哪兒?

即使您執行@choice = 3,也不會滿足這兩個條件,因為您在第二個條件中具有ELSE IF。 當您使@choice = 3時,第一個IF將為true,並且不會進入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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM