【问题标题】:Transaction in stored procedure not rolling back存储过程中的事务不回滚
【发布时间】:2015-03-22 03:55:57
【问题描述】:

我有存储过程 sp_Insert 有 2 个选项,例如。 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 只运行第一个查询(插入到 table1),如果@choice = 2 只运行第二个查询(插入到第二个表),如果 @choice = 3 运行第一个和第二个查询以将数据库插入到第一个和第二张桌子。

问题:

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

【问题讨论】:

  • 旁注:CREATE PROCEDURE:“在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。”

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


【解决方案1】:

即使您会执行@choice = 3,您也永远不会同时满足这两个条件,因为您在第二个条件中有 ELSE IF。当您使@choice = 3 时,第一个 IF 将为真,它不会转到 ELSE。如果您想进入第二部分,请将 ELSE IF 更改为 just 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

【讨论】:

  • 感谢您的回答,将 ELSE IF 更改为 IF 并且成功了!
猜你喜欢
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2020-04-15
  • 2014-10-06
相关资源
最近更新 更多