[英]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.