我有一个存储过程,它只在其中执行 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) 我使用的数据库应用程序中一个相当常见的模式是需要为具有“预览模式”的报表或实用程序创建存储过程。当这样的过程进行更新时,此参数指示应返回操作的结果,但该过程不应实际执行对数据库的更新。
实现这一点的一种方法是简单地if为参数编写一个语句,并有两个完整的代码块;其中一个更新并返回数据,另一个只返回数据。但这是不可取的,因为代码重复和相对较低的置信度,即预览数据实际上是更新后会发生的情况的准确反映。
以下示例尝试利用事务保存点和变量(不受事务影响,与临时表相反)将预览模式的单个代码块用作实时更新模式。
注意:事务回滚不是一个选项,因为此过程调用本身可能嵌套在事务中。这是在 SQL Server 2012 上测试的。
CREATE TABLE dbo.user_table (a int);
GO
CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] (
@preview char(1) = 'Y'
) AS
CREATE TABLE #dataset_to_return (a int);
BEGIN TRANSACTION; -- preview mode required infrastructure
DECLARE @output_to_return TABLE (a int);
SAVE TRANSACTION savepoint;
-- do stuff here
INSERT INTO dbo.user_table (a)
OUTPUT inserted.a INTO @output_to_return (a)
VALUES (42);
-- catch preview mode
IF @preview = 'Y'
ROLLBACK TRANSACTION savepoint;
-- save output to temp table …Run Code Online (Sandbox Code Playgroud)