【问题标题】:Table lock in Stored procedure存储过程中的表锁
【发布时间】:2017-02-15 06:14:47
【问题描述】:

我正在使用返回 5-6 个表的存储过程,并且该过程可能同时被许多用户(5-10 个用户)同时使用。

过程只有“选择”语句。

所以我只是想确认当过程调用或没有锁时,存储过程的表是否有任何锁。

我正在使用 MS SQL Server 2012 和 Visual Studio 2013。

【问题讨论】:

  • 是的,锁适用于桌子,你应该知道它的基本概念。如果有人插入或更新记录表将被锁定和解锁。最好的方法是像这样使用 select 语句:select * from table with(nolock).... 一旦数据被插入或更新,锁将被自动删除。
  • @Dirty,在我的过程中,我只使用“Select”语句”。所以你的意思是我必须像这样更改我的查询 - Select * from table with(nolock)
  • 不要使用“with (nolock)”!它将允许您的程序在提交之前读取当前正在被正在进行的事务更新甚至删除的行(脏读)。
  • @sunil,使用 nolock 会给您一个好处,即它不会在其他人更新或插入新数据时锁定任何数据,缺点是您可能会读取脏数据。和我一样,我总是在我的项目中使用 nolock,因为我提供了优先插入、更新和删除。在您的情况下,您似乎必须决定您的数据包含什么?是否允许脏读数据?在您的情况下,唯一的缺点是用户会在数据表上锁定,其他用户必须等到锁定被释放。
  • @Dirty,感谢您的回答。我只是想问一下 whta 是“脏读数据”,这是否也适用于“选择”。意味着如果用户“A”正在使用我的程序,它有一些“选择”语句,并且用户“B”,“C”...等也同时使用我的程序,所以程序不应该阻塞/锁定任何表用于“选择”以及“插入、更新或删除”操作。

标签: c# sql-server stored-procedures sql-server-2012


【解决方案1】:

会有S (shared) locks: “用于不更改或更新数据的读取操作,例如 SELECT 语句。”请注意,S 锁不会阻止其他读取操作。

【讨论】:

    【解决方案2】:

    每当过程调用或没有锁时,存储过程的表是否有任何锁。

    select 语句,会占用共享锁。这个锁会占用多长时间取决于你的隔离级别

    Readcommitted:读行后锁会立即释放

    可重复读取:共享锁将被占用直到事务结束,因此无法修改选定的行

    可序列化:在事务期间将采取锁定,不能添加新行或也不能修改旧行

    【讨论】:

    • #TheGameiswar,如果我不使用任何隔离级别呢?意味着我只是使用这样的 select 语句- 从表中选择 * 或者如果我像这样使用 NOLock 会发生什么- 从表中选择 * (NoLock)
    • @sunil:当你使用 nolock 时,这意味着你可能有机会读取未提交的数据
    • @Sunil,默认隔离级别是Read Committed。因此,如果您没有指定任何隔离级别,那么您正在使用 Read Committed。
    【解决方案3】:

    在您的情况下,无需考虑锁定。放轻松。在锁区,当多个进程同时被占用时,部分进程插入或更新数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2023-03-12
      • 2011-02-24
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多