如何在某些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