你好,我有一些存储过程可以在我的网站上创建产品和其他东西。现在我必须在事务中运行其中一些。这可能吗?还是我必须只为事务创建一个存储过程?
我能说一些类似的话吗
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