我有一个存储过程,它选择1记录回来。存储过程可以从不同的PC上的几个不同的应用程序调用。这个想法是,存储过程带回需要处理的下一条记录,并且如果两个应用程序同时调用存储过程,则不应该返回相同的记录。我的查询在下面,我试图尽可能高效地编写查询(SQL 2008)。它能比这更有效地完成吗?高效交易,记录锁定
CREATE PROCEDURE GetNextUnprocessedRecord
AS
BEGIN
SET NOCOUNT ON;
--ID of record we want to select back
DECLARE @iID BIGINT
-- Find the next processable record, and mark it as dispatched
-- Must be done in a transaction to ensure no other query can get
-- this record between the read and update
BEGIN TRAN
SELECT TOP 1
@iID = [ID]
FROM
--Don't read locked records, only lock the specific record
[MyRecords] WITH (READPAST, ROWLOCK)
WHERE
[Dispatched] is null
ORDER BY
[Received]
--Mark record as picked up for processing
UPDATE
[MyRecords]
SET
[Dispatched] = GETDATE()
WHERE
[ID] = @iID
COMMIT TRAN
--Select back the specific record
SELECT
[ID],
[Data]
FROM
[MyRecords] WITH (NOLOCK, READPAST)
WHERE
[ID] = @iID
END
我不相信这个TSQL是事务安全... – 2009-02-22 08:07:45
尝试把一个WAITFOR DELAY“0:2:0”后的SELECT和UPDATE之前,运行SP,并从另一个连接实际执行同一SP ... – 2009-02-22 08:17:24
,我错了! HOLDLOCK与MyRecords表上的REPEATABLEREAD具有相同的效果。 – 2009-02-22 08:22:27