我有一个存储过程,它只在其中执行 3 个存储过程。如果主 SP 成功,我只使用 1 个参数来存储。
如果第一个存储过程在主存储过程中工作正常,但第二个存储过程失败,那么它会自动回滚主 SP 中的所有 SP 还是我必须发出一些命令?
这是我的程序:
CREATE PROCEDURE [dbo].[spSavesomename]
-- Add the parameters for the stored procedure here
@successful bit = null output
AS
BEGIN
begin transaction createSavebillinginvoice
begin Try
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN
EXEC [dbo].[spNewBilling1]
END
BEGIN
EXEC [dbo].[spNewBilling2]
END
BEGIN
EXEC [dbo].[spNewBilling3]
END
set @successful = 1
end Try
begin Catch
rollback transaction createSavesomename
insert …Run Code Online (Sandbox Code Playgroud) 我们真的需要 C# 中的事务处理以及双方的数据库存储过程吗?
C#:
Using(transaction with transaction scope)
{
Execute stored proc;
Transaction. Complete;
}
Run Code Online (Sandbox Code Playgroud)
SQL存储过程:
Create process
As
Begin try
Begin transaction
Commit
End try
Begin catch
Rollback
End catch
Run Code Online (Sandbox Code Playgroud) 在 SQL Server 代码块中,放置提交事务的最佳位置是什么?在 try catch 块内部还是外部?
例如,选项 A 或选项 B 是正确的方法还是主观选择?
选项A
CREATE PROCEDURE DummyProc
BEGIN TRY
BEGIN TRANSACTION
INSERT sometable(a, b) VALUES (@a, @b)
INSERT sometable(a, b) VALUES (@b, @a)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
DECLARE @msg nvarchar(2048) = error_message()
RAISERROR (@msg, 16, 1)
RETURN 55555
END CATCH
Run Code Online (Sandbox Code Playgroud)
选项B
CREATE PROCEDURE DummyProc
BEGIN TRY
BEGIN TRANSACTION
INSERT sometable(a, b) VALUES (@a, @b)
INSERT sometable(a, b) VALUES (@b, @a)
END TRY
BEGIN …Run Code Online (Sandbox Code Playgroud)