2016-03-24 18 views
0

Merhaba Birden çok kullanıcının aynı anda bir tabloyu güncelleştirmesini önlemek istiyorum.Birden çok kullanıcının aynı SQL Server saklı yordamını aynı anda çalıştırmasını engelleyin

DB "abc" güncelleştirmesinde "abd.dbo.xyz" tablosunda bu tablo gereklidir. SQL için yeniyim, ancak henüz gereksinimlerimi karşılamayan bir kod yazdım.

Herhangi bir yardım? 1 prosedürü kilidi serbest bırakılması için beklemek zorunda anlamına gelirken sonuç, (0,1) ise

use [abc] 
BEGIN TRANSACTION 
DECLARE @res INT 
EXEC @res = sp_getapplock 
@Resource = 'This a Lock ID', 
@LockMode = 'Exclusive', 
@LockOwner = 'Transaction', 
@LockTimeout = 15000, 

IF @res NOT IN (0, 1) 
BEGIN 
    RAISERROR ('Unable to acquire Lock', 16, 1) 
END 
ELSE 
BEGIN 

-- this is update command which i need to run one instance only 
Update abc.dbo.xyz set IsKeyProduct= NULL Where IsKeyProduct is not NULL; 

EXEC @res = sp_releaseapplock 
@Resource = 'This a Lock ID', 
@DbPrincipal = 'public', 
@LockOwner = 'Transaction' 

END 
COMMIT 
+0

Sen gerekenden daha fazla iş yapıyor olabilir bırakmadan ile rahatsız gerekir, böylece sürece işlem çalıştığı gibi kilit tutmak için söyler. Tablo ipuçlarını gözden geçirin ve istediğinizi yapıp yapmadıklarını görün: https://technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx. –

+1

Bunun nedeni nedir? DBMS bunu ele alıyor. – Dane

+0

Güncelleme komutu yerine bitirmek için yaklaşık 60 dakika süren saklı bir procum var. Aynı zamanda başka bir kullanıcı aynı işi çalıştırırsa, tamamlanması (90 dakika) çok zaman alır. Bu yüzden bu sorunu önlemek istiyorum. – Ramaq

cevap

0

Sen kontrol ediyoruz. Yalnızca (0) kontrol, bu kilit hemen

kolay yolu saklı yordamda sp_getapplock kullanmaktır (bu yüzden proc başka hiçbir örneği runnig edildi) verildi demektir. Eğer @lockResult kontrol shuold ve 0'a eşit değilse, hiçbir şey yapmadan dönmelidir sonra

Exec @lokcResult =sp_getapplock @Resource='MyLock', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout = 500 

. bakınız getapplock belgeleri: https://msdn.microsoft.com/en-us/library/ms189823.aspx

@LockOwner='Transaction' aslında yok kilit

İlgili konular