Aracılığıyla paylaş


sp_getapplock (Transact-SQL)

Bir uygulama kilit yerleştirir kaynak.

Topic link iconTransact-SQL sözdizimi kuralları

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'
    Bir dize, kilit kaynağını tanımlayan bir ad belirterek iş.Uygulama, kaynak adı benzersiz olduğundan emin olmalısınız.The specified name is hashed internally into a value that can be stored in the SQL Server lock manager.resource_name is nvarchar(255) with no default.Bir kaynak dizesi uzunsa nvarchar(255), için kesilir nvarchar(255).

    resource_name Karşılaştırma ikili; böylece bağımsız olarak, geçerli veritabanı harmanlama ayarlarını duyarlıdır.

    Not

    Düz metin olarak alınan bir uygulama kilit sonra yalnızca ilk 32 karakter alınabilir; kalan sağlaması.

  • [ @LockMode = ] 'lock_mode'
    Is the lock mode to be obtained for a particular resource.lock_mode is nvarchar(32) and has no default value.Değer aşağıdakilerden biri olabilir: Paylaşılan, Güncelleştirme, IntentShared, IntentExclusive, or Özel kullanım.

  • [ @LockOwner = ] 'lock_owner'
    Is the owner of the lock, which is the lock_owner value when the lock was requested.lock_owner is nvarchar(32).Değeri olabilir Hareket (varsayılan) veya oturum.Zaman lock_owner değer Hareket, varsayılan olarak veya açıkça, belirtilmedi.sp_getapplock bir işlem içinde yürütülmelidir.

  • [ @LockTimeout = ] 'value'
    Kilit saat aşımı değeri milisaniye cinsinden belirtilir.Varsayılan değer @@ LOCK_TIMEOUT tarafından döndürülen değeri ile aynıdır.Isteği hemen sağlanamadı bir kilitleme isteği için Kilit, bekleme yerine hata dönmelidir olduğunu belirtmek için , belirtin 0.

  • [ @DbPrincipal = ] 'database_principal'
    Kullanıcı, role veya veritabanında bir nesne için izinleri olan uygulama rolü belirtilir.Arayanın işlevnin olmalıdır bir üye, database_principal, dbo, or the db_owner işlev başarıyla aramak için veritabanı rolü sabit.Varsayılan ortaktır.

Dönüş Kodu Değerleri

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

Değer

Sonuç

0

Kilit zaman uyumlu olarak başarıyla verildi.

1

Yayımlanacak diğer uyumsuz kilitlerine 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, çıkmaz kurban seçildi.

-999

Bir parametre doğrulamasını veya başka bir çağrı hata gösterir.

Remarks

Yerleştirilen kilitlerin bir kaynak geçerli hareket veya geçerli oturum ile ilişkili.Hareketi tamamlar veya geri alır, geçerli hareket ile ilişkili kilitlerin serbest bırakılır.Oturum kaydediliyor, oturum ile ilişkili kilitlerin serbest bırakılır.Sunucu herhangi bir nedenle kapatıldığında, tüm kilitler serbest bırakılır.

Tarafından oluşturulmuş kilit kaynak sp_getapplock geçerli veritabanında oturum için oluşturulur.Her bir kilit kaynak tarafından birleşik değerlerini tanımlanır:

  • Kilidin içeren veritabanı, veritabanı KIMLIĞI kaynak.

  • Belirtilen veritabanı ilkesine @ DbPrincipal parametresi.

  • Belirtilen kilit adı @ Kaynak parametresi.

Yalnızca belirtilen veritabanı anapara üyesi @ DbPrincipal parametresi, bu güvenlik sorumlusunun belirttiğiniz uygulama kilitleri elde edebilirler.Üyeleri dbo and db_owner roller, tüm rolleri üyeleri örtülü olarak düşünülür.

Kilitlerin açıkça ile yayımladı sp_releaseapplock.Bir uygulama çağırdığında sp_getapplock için birden çok kez aynı kilit kaynak, sp_releaseapplock aynı sayıda kilidi açmak için bir kez çağrılması gerekir.

If sp_getapplock aynı kilit kaynak için birden çok kez verilir, ancak tüm istekleri belirtilen kilit modu varolan modla aynı değil, kaynak üzerindeki etkisini iki kilit modu, bir sendikaya.Çoğu durumda, Bu kilit modu için güçlü yükseltildikten gösterir kilit modu, varolan modu veya yeni istenen mod.Bu daha güçlü bir kilit modu, kilit yayın aramaları bu saat önce gerçekleşmiş olan bile kilidi sonuçta yayımlanıncaya kadar tutulur.Örneğin, arama aşağıdaki sırayla kaynak tutulur Exclusive içinde yerine modu Shared modu.

USE AdventureWorks;
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

Bir uygulama kilit ile BIR çıkmaz uygulama kilidi istenen işlem geri almak almak değil.Dönüş değeri bir sonucu olarak gerekebilir geri alma işlemi el ile yapılması gerekir.Sonuç olarak, hata denetimi kodu, if belirli değerleri (örneğin, -3), bir ROLLBACK TRANSACTION döndürülen veya başka bir eylem başlatan dahil olduğunu öneririz.

Aşağıda bir örnek verilmiştir:

USE AdventureWorks;
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 Server Kaynak nitelemek için geçerli veritabanı KIMLIĞI kullanır.Bu nedenle, sp_getapplock farklı veritabanında aynı parametre değerleriyle bile yürütüldüğünde, sonuç ayrı kaynaklar ayrı kilitler.

Use sys.dm_tran_locks dinamik yönetim görünümü ya dasp_lock yordam, kilit bilgileri incelemek veya Sistem saklıSQL Server Profiler kilitlerin izlemek için .

İzinler

Üyelik gerektirir Ortak roldür.

Örnekler

Aşağıdaki örnek, kaynağın geçerli hareketle ilişkili olan paylaşılan kilit yerleştirir Form1 içinde AdventureWorks Veritabanı.

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

Aşağıdaki örnek belirtir. dbo Veritabanı sorumlusu.

EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks', 
     @LockMode = 'Shared';
GO