SQL Server:存储过程事务



你好,我有一些存储过程可以在我的网站上创建产品和其他东西。现在我必须在事务中运行其中一些。这可能吗?还是我必须只为事务创建一个存储过程?

我能说一些类似的话吗

BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT

要添加到上面的其他答案中,您可能需要添加一些错误处理:

BEGIN TRAN
BEGIN TRY
   EXEC P1
   EXEC P2
   COMMIT TRAN
END TRY
BEGIN CATCH
  ROLLBACK TRAN
END CATCH

使用C#代码更新(我个人发现将跨代码排除在存储过程和数据层之外要容易得多,这使得在稍后阶段编写存储过程变得更容易):

using (var conn = new SqlConnection(...))
    trans = conn.BeginTransaction();
    try
   {
       ...call P1 using transaction
       ...call P2 using transaction
       trans.Commit();
   }
   catch
   {
       trans.RollBack();
       throw;
   }
}

是的,存储过程可以在事务中运行。请在下面找到一个示例查询。

create table temp1
(
    id int,
    name varchar(20)
)
create table temp2
(
    id int,
    name varchar(20)
)
go
create proc p1 as
insert temp1 values (1, 'test1')

create proc p2 as 
insert temp2 values (1, 'test2')
go  
begin tran tx
exec p1
exec p2
commit

从SQL Server(不确定其他RDBMS),您可以在事务中调用多个存储过程。

BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN

您可能需要向存储的proc添加一个返回代码,以检查如果存储的proc1失败,是否应该运行存储的proc2

编辑:要检查返回代码,可以执行以下操作。这将运行第一个存储的进程。如果返回0,则运行第二个。如果第二个返回0,则它提交事务。如果其中一个返回非0,则它将回滚事务

DECLARE @ReturnValue INT
BEGIN TRAN
  EXEC @ReturnValue = StoredProc1
  IF @ReturnValue = 0
  BEGIN
    EXEC @ReturnValue = StoredProc2
    IF @ReturnValue = 0
    BEGIN
      COMMIT
    END
    ELSE
    BEGIN
      ROLLBACK
    END
  END
  ELSE
  BEGIN
    ROLLBACK
  END
Begin TRAN
BEGIN TRY
  -- your Action
  Commit TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
  BEGIN
    ROLLBACK TRAN
  END 
END CATCH

最新更新