您好,我有一些存储过程可以在我的网站上创建产品和其他内容。现在我必须在事务中运行其中一些。这是可能的还是我必须只为事务创建一个存储过程?
我可以说类似
BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
您好,我有一些存储过程可以在我的网站上创建产品和其他内容。现在我必须在事务中运行其中一些。这是可能的还是我必须只为事务创建一个存储过程?
我可以说类似
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# 代码更新(我个人发现将 trans 代码保留在存储过程之外和数据层中要容易得多 - 使得在稍后阶段更容易编写存储过程):
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