【问题标题】:SQL Server 2008 stored proc running concurrently causing delaysSQL Server 2008 存储过程同时运行导致延迟
【发布时间】:2012-01-10 12:33:41
【问题描述】:

我有一个问题,当从同一个应用程序的两个不同实例同时运行同一个存储过程时,它似乎超时了,我想知道是否有什么可以解决的?

我相信问题出在 SQL Server 2008 处理自身、锁定行和执行 SP 的方式上……我不太了解的事情。该应用程序使用ADODB.Command 来执行 SP。

我有一个 VB6 exe (App.exe),在一台服务器上多次运行。此应用程序调用数据库上的存储过程,该过程返回该应用程序的下一个序列号。此序列号字段对于应用程序的实例是唯一的 - 对于正在运行的应用程序的每个实例,表 (tbl_SequenceNos) 中有 1 行。

例如,假设我们正在运行:App[a].exeApp[b].exe

tblSequenceNos 看起来像:

iAppNo| iNextSequenceNo
  a   |     1234 
  b   |     4567

获取下一个序列号的存储过程比较简单:

CREATE PROEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
AS
BEGIN
    DECLARE @TempSequenceNo int

    SELECT @NextSequenceNo = iNextSequenceNo 
    FROM tblSequenceNos 
    WHERE iAppNo = @AppNo

    @NextSequenceNo = @NextSequenceNo + 1

    UPDATE tblSequenceNos 
    SET iNextSequenceNo = @NextSequenceNo
    WHERE iAppNo = @AppNo

END

App[a].exeApp[b].exe 都尝试运行此过程以获取它们的NextSequenceNo 值时,它们会挂起大约30 秒(ADO 超时?)。

因为每个应用程序从不查看彼此的行,所以我认为这将在不指定特殊锁定的情况下同时工作。有什么我想念的吗?我想也许我需要指定只锁定行,而不是整个表或页面? - 不知道sql2008默认是做什么的。

非常感谢任何帮助! 先感谢您 安德鲁

【问题讨论】:

    标签: sql-server-2008 stored-procedures isolation-level table-locking database-locking


    【解决方案1】:

    您的过程不是线程安全的,并且会产生不正确的结果,因为在选择和更新之间,多个线程可能会获得相同的序列 nr。

    CREATE PROCEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
    AS
    
     DECLARE @var table(seq int);
    
     UPDATE tblSequenceNos 
        SET iNextSequenceNo = @NextSequenceNo + 1
     OUTPUT inserted.iNextSequenceNo INTO @var;
      WHERE iAppNo = @AppNo
    
      select @NextSequenceNo = seq from @var
    GO  
    

    还要确保您的 iAppNo 列已编入索引。 (这意味着仅此列上的索引或该字段是索引中第一个字段的索引)

    【讨论】:

    • +1 该死 - 比我快几秒钟! :-) 这确实是最好的方法,当然!
    • 谢谢大家 :)。 iAppNo 是表上的主键。我可以保证在传递给它的相同@AppNo 的多个线程上不会调用SP。考虑到这一点,您会期待锁定问题吗?
    • Sql Server 将获取页面锁,这可能会阻塞无关 iappno 上的线程。
    • 嗯,这就是我的想法。有没有办法只强制行锁?
    • WITH ROWLOCK 添加到您的查询中。 (注意只是加锁提示,sql server 还是会升级锁的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2015-08-28
    • 2011-05-07
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多