首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不锁定其他事务的情况下写入表

如何在不锁定其他事务的情况下写入表
EN

Stack Overflow用户
提问于 2016-10-05 16:48:35
回答 2查看 51关注 0票数 2

我有一个中央记录表,其中记录了各种活动。有一个用于写入日志的过程,如下所示:

代码语言:javascript
复制
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分钟。在此期间,会记录一些步骤。问题是日志表被锁定了。而其他进程则会超时或变慢。

我想写入事务中的日志表,只是为了进行协议整理,但是写入日志本身不一定是事务的一部分。因此,在回滚的情况下,日志应该仍然在那里。

这有可能吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-05 17:03:55

如果从应用程序服务器调用procedure,则可以使用select语句,而不是将insert命令写入日志table,无论事务是提交还是回滚,都可以在事务之后重用这些语句。使用这些结果,您可以生成一个日志语句,该语句将把记录insert到日志table中。

票数 2
EN

Stack Overflow用户

发布于 2016-10-05 18:56:10

Table variables aren't affected by user transaction rollback

因此,在复杂的存储过程开始时,创建一个与永久tblLog表具有相同结构的表变量。

将所有日志记录步骤插入到此表变量中,而不是永久tblLog表中。

在复杂存储过程的末尾(不管是提交还是回滚主要工作),使用一个简单的INSERT将表变量中的所有行复制到永久tblLog表中。

因此,永久tblLog表的锁定将保持在最低限度。

显然,如果主存储过程遇到一些严重错误,一些日志可能会丢失,严重到足以中止中间的过程,并且永远不会到达将临时表变量中的行复制到永久tblLog表中的最终INSERT

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39869363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档