我有一个中央记录表,其中记录了各种活动。有一个用于写入日志的过程,如下所示:
create procedure [client].[procClient_LogText]
(
@LogText nvarchar(4000),
@LogLevel tinyint = 1,
@LogLongText nvarchar(max) = NULL,
@LogModule nvarchar(200) = NULL
)
as
insert into dbo.tblLog(LogLevel, LogText, LogLongText, LogModule)
values (@LogLevel, @LogText, @LogLongText, @LogModule);现在我有一个很长的事务,需要5-10分钟。在此期间,会记录一些步骤。问题是日志表被锁定了。而其他进程则会超时或变慢。
我想写入事务中的日志表,只是为了进行协议整理,但是写入日志本身不一定是事务的一部分。因此,在回滚的情况下,日志应该仍然在那里。
这有可能吗?
发布于 2016-10-05 17:03:55
如果从应用程序服务器调用procedure,则可以使用select语句,而不是将insert命令写入日志table,无论事务是提交还是回滚,都可以在事务之后重用这些语句。使用这些结果,您可以生成一个日志语句,该语句将把记录insert到日志table中。
发布于 2016-10-05 18:56:10
Table variables aren't affected by user transaction rollback。
因此,在复杂的存储过程开始时,创建一个与永久tblLog表具有相同结构的表变量。
将所有日志记录步骤插入到此表变量中,而不是永久tblLog表中。
在复杂存储过程的末尾(不管是提交还是回滚主要工作),使用一个简单的INSERT将表变量中的所有行复制到永久tblLog表中。
因此,永久tblLog表的锁定将保持在最低限度。
显然,如果主存储过程遇到一些严重错误,一些日志可能会丢失,严重到足以中止中间的过程,并且永远不会到达将临时表变量中的行复制到永久tblLog表中的最终INSERT。
https://stackoverflow.com/questions/39869363
复制相似问题