Sql server 2008 嵌套存储过程和事务作用域
我有一个主要的工作程序和一个附带的日志记录程序。我希望验证我对sql server 2008的假设。期望的结果是SP1做它能做的任何工作,并在记录进度的过程中调用SP2。无论SP1是否遇到会导致其事务回滚的错误,SP2工作都会提交 我的东西看起来安全吗?我是否需要在SP2中以不同的方式命名事务Sql server 2008 嵌套存储过程和事务作用域,sql-server-2008,stored-procedures,scope,Sql Server 2008,Stored Procedures,Scope,我有一个主要的工作程序和一个附带的日志记录程序。我希望验证我对sql server 2008的假设。期望的结果是SP1做它能做的任何工作,并在记录进度的过程中调用SP2。无论SP1是否遇到会导致其事务回滚的错误,SP2工作都会提交 我的东西看起来安全吗?我是否需要在SP2中以不同的方式命名事务 ------------------------------------------------------- SP1 pseudocode BEGIN TRY BEGIN TRANSACTION
------------------------------------------------------- SP1 pseudocode
BEGIN TRY
BEGIN TRANSACTION
-- Do stuff
-- log progress
exec SP2( getutcdate(), 'source_is_sp1','message for progress');
-- Do more stuff
-- log progress
exec SP2( getutcdate(), 'source_is_sp1','message for progress');
-- etc
COMMIT TRANSACTION
RETURN 0
END TRY
BEGIN CATCH
-- error handling not important
ROLLBACK TRANSACTION
return @StepNumber -- not important
END CATCH
------------------------------------------------------- SP2
CREATE PROCEDURE [dbo].[SP2]
@Source as nvarchar(100),
@Timestamp as datetime,
@Message as nvarchar(4000)
AS
BEGIN
SET NOCOUNT ON;
IF @Timestamp is null
BEGIN
set @Timestamp = GETUTCDATE();
END
IF @Source IS NOT NULL AND @Message IS NOT NULL
BEGIN
BEGIN TRANSACTION;
INSERT INTO LOG(LOGTIMESTAMP, SOURCEVCH, MESSAGEVCH)
VALUES (@Timestamp, @Source, @Message);
COMMIT TRANSACTION;
END
END
在本例中,当调用外部事务的回滚时,将回滚对日志的写入,反之,当调用外部事务的提交时,将提交对日志的写入。如果在SP中使用事务,则应检查@TRANCOUNT以确保提交是安全的。可能正在进行日志记录,但在回滚后添加一个日志条目以记录导致回滚的错误。感谢您的评论。是的,我也想在catch块中做一个日志消息。我真的很想记录整个过程,即使我不得不回滚事务。所以我的假设是错误的。在获得更深入的速成课程后,似乎所有这些内部事务都将回滚。从我最近了解到,插入/更新/删除的局部变量表不会回滚。因此,我可以定义一个本地@Logs,在此过程中对其进行操作,最后在try或catch结束时将其记录到主日志表中。