如何在某些SQL行上运行进程时锁定它们?
时间:2020-03-05 18:48:17 来源:igfitidea点击:
我的工作有一个财务应用程序,用" VB.NET"和" SQL"编写,可以同时处理多个用户。
在某个时候,一个用户可能决定发布他们(可能还有其他人)当前正在处理的一批条目。
显然,启动发布过程后,我不再希望任何其他用户添加,编辑或者删除该批次中的条目。
我已经看到我可以通过在Post进程启动时打开SQL事务来锁定所有数据,但是该过程可能会很漫长,因此我不希望在完成该功能所需的几分钟内不要打开Transaction。 。
有没有一种方法可以仅锁定我知道需要从VB.NET代码进行操作的记录?
解决方案
回答
添加
with (rowlock)
到你的SQL查询
SQL Server性能文章
编辑:好的,我误解了这个问题。我们想要的是事务隔离。 +1到乔尔:)
回答
如果使用的是Oracle,则可以选择要锁定的行上的更新。
这是一个例子
SELECT address1 , city, country FROM location FOR UPDATE;
回答
我们可能想为整个事务设置隔离级别,而不是在特定表上使用(行锁)。
看这个页面:
http://msdn.microsoft.com/en-us/library/ms173763.aspx
具体来说,在其中搜索"行锁",我想我们会发现READ COMMITTED或者REPEATABLE READ是我们想要的。 READ COMMITTED是SQL Server的默认设置。如果" READ COMMITTED"对我们来说似乎还不够强大,那么请进行" REPEATABLE READ"。
更新:阅读后续帖子之一后,我们肯定希望重复阅读。这将保持锁定状态,直到我们提交或者回滚事务为止。
回答
将其包装在tran中,在选择中使用holdlock + updlock
例子
begin tran select * from SomeTable (holdlock,updlock) where .... processing here commit