8

Basit bir soru. SQL 2008'de saklı bir prosedürüm varsa (aşağıya bakınız) ilk iki ifade arasında bir yarış durumu riskini çalıştırır mıyım veya saklı yordam, işlemler gibi dokundukları şeylere bir kilit koyar mı?Saklanan prosedürler tabloları/satırları kilitler mi?

ALTER PROCEDURE [dbo].[usp_SetAssignedTo] 
    -- Add the parameters for the stored procedure here 
    @Server varchar(50), 
    @User varchar(50), 
    @UserPool varchar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Declare @ServerUser varchar(50) 

    -- Find a Free record 
    SELECT top 1 @ServerUser = UserName 
    from ServerLoginUsers 
    where AssignedTo is null and [TsServer] = @Server 

    --Set the free record to the user 
    Update ServerLoginUsers 
    set AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool 
    where [TsServer] = @Server and UserName = @ServerUser 

    --report record back if it was updated. Null if it was not available. 
    select * 
    from ServerLoginUsers 
    where [TsServer] = @Server 
     and UserName = @ServerUser 
     and AssignedTo = @User 
END 

cevap

3

Bir yarış durumu alabilirsiniz.

Bu bir açıklamada yapılabilir

:

  • Sen
  • kilit ipuçları izin UPDATE atayabilirsiniz başka işlem
  • ÇIKIŞ fıkra döner veri arayana bu satırı atlamak

bu deneyin ...:

(düzenleme HOLDLOCK kaldırıldı) 10
Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST) 
OUTPUT INSERTED.* 
SET 
    AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool 
WHERE 
    AssignedTo is null and [TsServer] = @Server -- not needed -> and UserName = @ServerUser 

Değilse, ayrı bir seçme

Update TOP (1) ServerLoginUsers WITH (ROWLOCK, READPAST) 
SET 
    -- yes, assign in an update 
    @ServerUser = UserName, 
    -- write 
    AssignedTo = @User, AssignedToDate = getdate(), SourcePool = @UserPool 
OUTPUT INSERTED.* 
WHERE 
    AssignedTo is null and [TsServer] = @Server -- not needed -> and UserName = @ServerUser 

SELECT ... 

bu lütfen bakınız gerekebilir daha: SQL Server Process Queue Race Condition

+0

çıkış deyimi ben ilk örneğini kullanılan doğru sözdizimi –

+0

için sette sonra koymak gerekiyor ama hatayı aldım '' READPAST kilidini yalnızca OKUMA KOMİTE veya REPEATABLE READ yalıtım seviyelerinde belirtebilirsiniz. –

+0

Ah Tamam, bırakın HOLDLOCK sonra – gbn

İlgili konular