Aracılığıyla paylaş


sp_getapplock (Transact-SQL)

Uygulama kaynak kilit yerleştirir.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

sp_getapplock [ @Resource = ] 'resource_name' ,
     [ @LockMode = ] 'lock_mode' 
     [ , [ @LockOwner = ] 'lock_owner' ] 
     [ , [ @LockTimeout = ] 'value' ]
     [ , [ @DbPrincipal = ] 'database_principal' ]
[ ; ]

Bağımsız değişkenler

  • [ @Resource= ] 'resource_name'
    kilitkaynaktanımlayan bir ad belirten bir dize . Uygulama kaynak adı benzersiz olduğundan emin olmalısınız.Belirtilen adı dahili olarak depolanabilir bir değer içine karıştırılır SQL Server kilit Yöneticisi.resource_nameİş nvarchar(255)ile hiçbir varsayılan.kaynakdize daha uzun olup nvarchar(255)fazlalıkları için nvarchar(255).

    resource_nameikili karşılaştırma ve durum-duyarlı geçerli veritabanı harmanlama ayarları ne olursa olsun.

    Not

    Uygulama kilit aldı sonra ilk 32 karakteri yalnızca düz metin olarak alınabilir; Kalan sağlaması.

  • [ @LockMode= ] 'lock_mode'
    Belirli bir kaynakalınabilmesi için kilit modudur.lock_modeİş nvarchar(32) ve hiçbir varsayılan değeri.Değer aşağıdakilerden biri olabilir: Shared, Update, IntentShared, IntentExclusive, or Exclusive.

  • [ @LockOwner= ] 'lock_owner'
    Sahibi olan kilit, lock_owner değer kilit istendi.lock_owneris nvarchar(32).Değeri olabilir Transaction (varsayılan) veya Session.Zaman lock_owner değeri Transaction, bunun varsayılan veya açıkça belirtilen sp_getapplock gerekir yürütülen karşı içinde hareket.

  • [ @LockTimeout= ] 'value'
    kilitsaat-milisaniye cinsinden değerini öğrenin. Varsayılan değer @@ LOCK_TIMEOUT tarafından döndürülen değeri aynıdır.Bir kilit isteği isteği hemen verilemez, kilit bekleme yerine hata döndürmesi gerektiğini belirtmek için 0 değerini belirtin.

  • [ @DbPrincipal= ] 'database_principal'
    Kullanıcı, rol veya bir veritabanında bir nesne için izinleri olan uygulama rolü olabilir.işlev çağıran bir üye olmanız database_principal, dbo, veya db_owner sabit işlev başarıyla çağırmak için veritabanı rolü .Varsayılan ortak.

Dönüş Kodu Değerleri

>= 0 (başarılı) veya < 0 (hata)

Değer

Sonuç

0

kilit başarıyla zaman uyumlu olarak verildi.

1

Diğer uyumsuz kilitleri serbest bırakılacak bekledikten sonra kilit başarıyla verildi.

-1

kilit isteği zaman aşımına uğradı.

-2

kilit isteği iptal edildi.

-3

kilit isteği, çıkmazkurbanolarak seçildi.

-999

Parametre doğrulama veya diğer çağrısı hata gösterir.

Açıklamalar

kaynak üzerinde yerleştirilen kilitlerin geçerli hareket veya geçerli oturumile ilişkili.Hareketi tamamlar veya geri alınır Geçerli hareketle ilişkili kilitleri serbest bırakılırlar.' % S'oturumuna oturum açmış ' % s'oturumları oturum ile ilgili kilitleri serbest bırakılırlar.kapalı , tüm kilitleri serbest bırakılırlar.

kilitkaynak tarafından oluşturulan sp_getapplock oturumiçin geçerli veritabanında oluşturulmuş. Her kilit kaynak ile birleştirilmiş değerleri tanımlanır:

  • kilitkaynakiçeren veritabanı veritabanı kimliği.

  • Belirtilen veritabanı ilkeye @DbPrincipal parametresi.

  • Belirtilen kilit adı @Resource parametresi.

Belirtilen veritabanı sorumlusunun yalnızca üye @DbPrincipal parametresini belirtmek uygulama kilitleri satın alır, patron.Üyeleri dbo ve db_owner Rol üyeleri örtülü olarak kabultüm rolleri.

Kilitleri açıkça serbest bırakılabilir ile sp_releaseapplock.Uygulama ağda bir sp_getapplock birden çok kez aynı kilit kaynakiçin sp_releaseapplock aynı sayıda kilitaçmak için çağrılmalıdır.

sp_getapplock Birden çok kez aynı kilitkaynakiçin verilir, ancak kaynak üzerindeki etkisini Birliği iki kilit modları kilit modu, tüm istekleri belirtilen varolan modu ile aynı şey değildir, Çoğu durumda, kilit modu yükseltilmiş güçlü yani kilit modları, varolan modu ya da yeni istenen mod.Bu daha güçlü kilit modu kilit kilit yayın aramaları o saatönce oluşmuş olsa bile, sonuçta yayımlanıncaya kadar tutulur.Örneğin, aşağıdaki sırayla çağrıların, kaynak tutulur Exclusive yerine modunda Shared mod.

USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Shared';
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Exclusive';
EXEC @result = sp_releaseapplock @Resource = 'Form1';
COMMIT TRANSACTION;
GO

Uygulama kilit bir çıkmaz geri almak uygulama kilitistenen işlem yapar.Dönüş değeri bir sonucu olarak gerekli olabilecek geri alma işlemi el ile yapmanız gerekir.Sonuç olarak, belirli değerleri (örneğin, -3), rollback İŞLEMİNİ veya alternatif döndürülmezse eylem başlattığından böylece hata denetleme kodu eklenmesini öneririz.

İşte bir örnek:

USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Exclusive';
IF @result = -3
BEGIN
    ROLLBACK TRANSACTION;
END
ELSE
BEGIN
    EXEC @result = sp_releaseapplock @Resource = 'Form1';
    COMMIT TRANSACTION;
END;
GO

SQL Serverkaynakalabilmek için geçerli veritabanı kimliği kullanır.Bu nedenle, sp_getapplock farklı veritabanları üzerinde yürütülen, hatta ile aynı parametre değerleri, sonuç ayrı kilit ayrı kaynaklar.

Kullanın sys.dm_tran_locksdinamik yönetim görünümü veya sp_lock kilit bilgileri inceleyin veya kullanmak için sistem saklı yordam SQL Server Profiler İzleme kilitler.

İzinler

Üyelik gerektiren public rolü.

Örnekler

Aşağıdaki örnek, geçerli hareketle ilişkili olan paylaşılan kilit, kaynakyerleştirirForm1 , AdventureWorks2008R2 veritabanı.

USE AdventureWorks2008R2;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Shared';
COMMIT TRAN;
GO

Aşağıdaki örnekte verilmiştir dbo olarak veritabanı asıl adı.

BEGIN TRAN;
EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks2008R2', 
     @LockMode = 'Shared';
COMMIT TRAN;
GO