我有一個存儲過程,它選擇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