25

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

我可以说类似

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

4 回答 4

52

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

BEGIN TRAN

BEGIN TRY

   EXEC P1

   EXEC P2

   COMMIT TRAN

END TRY
BEGIN CATCH

  ROLLBACK TRAN

END CATCH

使用 C# 代码更新(我个人发现将 trans 代码保留在存储过程之外和数据层中要容易得多 - 使得在稍后阶段更容易编写存储过程):

using (var conn = new SqlConnection(...))

    trans = conn.BeginTransaction();

    try
   {
       ...call P1 using transaction
       ...call P2 using transaction

       trans.Commit();
   }
   catch
   {
       trans.RollBack();
       throw;
   }
}
于 2012-08-20T06:53:29.980 回答
3

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

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
于 2012-08-20T06:18:05.093 回答
2

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

BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN

您可能需要向存储过程添加返回码,以检查如果存储过程 1 失败,您是否应该运行存储过程 2

编辑:要检查返回码,您可以执行以下操作。这将运行第一个存储过程。如果它返回 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
于 2012-08-20T06:17:40.390 回答
2
Begin TRAN
BEGIN TRY
  -- your Action
  Commit TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
  BEGIN
    ROLLBACK TRAN
  END 
END CATCH
于 2018-12-18T14:41:36.147 回答