【发布时间】:2012-01-10 12:33:41
【问题描述】:
我有一个问题,当从同一个应用程序的两个不同实例同时运行同一个存储过程时,它似乎超时了,我想知道是否有什么可以解决的?
我相信问题出在 SQL Server 2008 处理自身、锁定行和执行 SP 的方式上……我不太了解的事情。该应用程序使用ADODB.Command 来执行 SP。
我有一个 VB6 exe (App.exe),在一台服务器上多次运行。此应用程序调用数据库上的存储过程,该过程返回该应用程序的下一个序列号。此序列号字段对于应用程序的实例是唯一的 - 对于正在运行的应用程序的每个实例,表 (tbl_SequenceNos) 中有 1 行。
例如,假设我们正在运行:App[a].exe 和 App[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].exe 和App[b].exe 都尝试运行此过程以获取它们的NextSequenceNo 值时,它们会挂起大约30 秒(ADO 超时?)。
因为每个应用程序从不查看彼此的行,所以我认为这将在不指定特殊锁定的情况下同时工作。有什么我想念的吗?我想也许我需要指定只锁定行,而不是整个表或页面? - 不知道sql2008默认是做什么的。
非常感谢任何帮助! 先感谢您 安德鲁
【问题讨论】:
标签: sql-server-2008 stored-procedures isolation-level table-locking database-locking