【问题标题】:How do I lock certain SQL rows while running a process on them?如何在某些 SQL 行上运行进程时锁定它们?
【发布时间】:2010-09-07 22:39:41
【问题描述】:

我的工作有一个财务应用程序,用VB.NETSQL 编写,多个用户可以同时处理。

在某些时候,一个用户可能决定发布他们(可能还有其他人)当前正在处理的这批条目。

显然,我不再希望任何其他用户在之后添加编辑删除该批次中的条目 strong> 后处理已启动。

我已经看到我可以通过在 Post 进程开始的那一刻打开 SQL 事务来锁定所有数据,但是这个过程可能会相当长,我不想让事务打开完成该功能可能需要几分钟。

有没有办法只锁定我知道需要从 VB.NET 代码操作的记录?

【问题讨论】:

    标签: sql database vb.net transactions locking


    【解决方案1】:

    如果您使用的是 Oracle,您将在您锁定的行上选择更新

    这是一个例子

    SELECT address1 , city, country
    FROM location
    FOR UPDATE;
    

    【讨论】:

      【解决方案2】:

      您可能希望为整个事务设置隔离级别,而不是在特定表上使用 with (rowlock)

      看看这个页面:
      http://msdn.microsoft.com/en-us/library/ms173763.aspx

      具体来说,在其中搜索“行锁”,我想你会发现 READ COMMITTED 或 REPEATABLE READ 是你想要的。 READ COMMITTED 是 SQL Server 的默认值。如果 READ COMMITTED 对您来说似乎不够强大,请选择 REPEATABLE READ。

      更新:阅读完您的一篇后续文章后,您肯定想要可重复阅读。这将保持锁定,直到您提交或回滚事务。

      【讨论】:

        【解决方案3】:

        添加

        with (rowlock)
        

        到您的 SQL 查询

        SQL Server Performance article

        编辑:好的,我误解了这个问题。你想要的是事务隔离。 +1 乔尔 :)

        【讨论】:

          【解决方案4】:

          将其包装在 tran 中,在 select 中使用 holdlock + updlock

          例子

          begin tran
          select * from
          SomeTable (holdlock,updlock)
          where ....
          
          
          processing here
          
          commit
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-24
            • 1970-01-01
            • 1970-01-01
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 2020-01-15
            相关资源
            最近更新 更多