繁体   English   中英

SQL Server:存储过程事务

[英]SQL Server : stored procedure transaction

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

我能说些什么吗?

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#代码更新(我个人觉得将代码保留在sprocs和数据层之外要容易得多 - 使得后续阶段的存储过程更容易编写):

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

您可能希望向存储过程添加返回代码,以检查是否应该在存储过程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
Begin TRAN
BEGIN TRY
  -- your Action
  Commit TRAN
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
  BEGIN
    ROLLBACK TRAN
  END 
END CATCH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM