sp_getapplock (Transact-sql)
Bir uygulama kaynak kilit yerleştirir.
Transact-SQL Sözdizim 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'
Kilit kaynak tanımlayan bir ad belirten bir dize. Uygulama kaynak adının benzersiz olduğundan emin olmalısınız. Belirtilen adı dahili olarak içine saklanabilir bir değer sağlaması SQL ServerKilit Yöneticisi. resource_nameise nvarchar(255)hiçbir varsayılan ile. Kaynak dize uzunsa nvarchar(255), için kesilecek nvarchar(255).resource_nameikili karşılaştırılır ve böylece geçerli veritabanı harmanlama ayarlarına bakılmaksızın duyarlıdır.
[!NOT]
Bir uygulama kilidi elde sonra yalnızca ilk 32 karakter düz metin olarak alınabilir; kalan karma.
[ @LockMode= ] 'lock_mode'
Belirli bir kaynak için elde edilebilir için kilit modudur. lock_modeise nvarchar(32)ve varsayılan değeri yok. Değeri aşağıdakilerden biri olabilir: Shared, Update, IntentShared, IntentExclusive, ya Exclusive.[ @LockOwner= ] 'lock_owner'
Sahibi olan kilit, lock_ownerdeğeri kilit istendiğinde. lock_owneris nvarchar(32). Değer-ebilmek var olmak Transaction(varsayılan) veya Session. Ne zaman lock_ownerdeğeri Transaction, tarafından varsayılan ya da açıkça, belirtilen sp_getapplockgelen bir işlemde yürütülmelidir.[ @LockTimeout= ] 'value'
Kilit zaman aşımı değeri milisaniye cinsinden olduğunu. Varsayılan değer, @@ LOCK_TIMEOUT tarafından döndürülen değeri aynıdır. Bir kilitleme isteği zaman isteği hemen verilemez kilit beklemek yerine hata döndürmelidir belirtmek için 0 belirtin.[ @DbPrincipal= ] 'database_principal'
Kullanıcı, rol veya bir veritabanında bir nesne izinleri olan uygulama rolü olduğunu. İşlevi çağıran bir üyesi olmanız database_principal, dbo, ya da db_ownersabit veritabanı rolü başarıyla işlevi çağırmak için. Varsayılan ortak.
Dönüş Kodu Değerleri
>= 0 (başarılı) veya < 0 (hata)
Değer |
Sonuç |
---|---|
0 |
Kilidi başarıyla zaman uyumlu olarak verildi. |
1 |
Kilidi başarıyla yayımlanacak diğer uyumsuz kilitleri bekledikten sonra verildi. |
-1 |
Kilitleme isteği zaman aşımına uğradı. |
-2 |
Kilitleme isteği iptal edildi. |
-3 |
Kilitleme isteği, kilitlenme kurbanı olarak seçildi. |
-999 |
Parametre doğrulama veya diğer çağrısı hata gösterir. |
Açıklamalar
Bir kaynaktaki yerleştirilen kilitlerin Cari işlem veya geçerli oturum ile ilişkili. Hareket tamamlandıktan veya geri olduğunda geçerli hareket ile ilişkili kilitleri serbest bırakılır. Oturum açtığı zaman oturumla ilişkili kilitleri serbest bırakılır. Sunucu herhangi bir nedenle kapatıldığında tüm kilitleri serbest bırakılır.
Kilit kaynak tarafından oluşturulan sp_getapplockgeçerli veritabanında oturum için oluşturulur. Her kilit kaynak Birleşik değerlerini tarafından tanımlanır:
Kilit kaynak içeren veritabanının veritabanı Kımlığı.
Belirtilen veritabanı ilke @DbPrincipalparametresi.
Belirtilen kilidi adı @Resourceparametresi.
Yalnızca belirtilen veritabanı anapara üyesi @DbPrincipalparametresi elde o anapara belirtmek uygulama kilitleri. Üyeleri dbove db_ownerrolleri örtülü olarak tüm rolleri üyeleri kabul edilir.
Kilitleri açıkça ile serbest sp_releaseapplock. Uygulama çağırdığında sp_getapplockbirden çok kez aynı kilit kaynak için sp_releaseapplockaynı sayıda kilidi açmak için çağrılmalıdır.
Eğer sp_getapplockbirden çok kez aynı kilit kaynak için denir ama kilit modu istekleri birinde belirtilen varolan modla aynı değil, kaynağın etkisi iki kilit modları bir Birliği. Çoğu durumda, bu kilit modu terfi güçlü demektir kilit modları, varolan modu veya yeni istenen mod. Sonuçta kilidi serbest bırakmak seslenmek o zaman önce oluşmuş bile kilidi serbest bırakılıncaya kadar bu güçlü kilit modu düzenlenmektedir. Örneğin, çağrıları aşağıdaki sırayla kaynak tutulur Exclusiveyerine modunda Sharedmod.
USE AdventureWorks2012;
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
USE AdventureWorks2012;
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 kilidi ile kilitlenme uygulama kilidi istenen hareket geri değil. Dönüş değeri sonucu gerekli olabilecek herhangi bir geri alma işlemi el ile yapmanız gerekir. Sonuç olarak, hata denetleme kodu, eğer belirli değerleri (örneğin, -3), rollback TRANSACTION döndürülür ya da alternatif eylemi başlattığından dahil ki öneririz.
İşte bir örnek:
USE AdventureWorks2012;
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
USE AdventureWorks2012;
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 ServerKaynak hak kazanmak için geçerli veritabanı kimliği kullanır. Bu nedenle, eğer sp_getapplockidam, hatta ile aynı parametre değerleri farklı veritabanları üzerinde ayrı ayrı kaynaklar kilitleri sonucudur.
Kullanın sys.dm_tran_locksdinamik yönetimi görünümü veya sp_locksistem saklı yordam kilit bilgileri, incelemek veya SQL Server Profilerkilitleri izlemek.
İzinler
Üyelik publicrolü.
Örnekler
Aşağıdaki örnek geçerli hareketle ilişkili, paylaşılan bir kilit yerlerde kaynağın Form1de AdventureWorks2012veritabanı.
USE AdventureWorks2012;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared';
COMMIT TRAN;
GO
USE AdventureWorks2012;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared';
COMMIT TRAN;
GO
Aşağıdaki örnek dboveritabanı anapara olarak.
BEGIN TRAN;
EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks2012',
@LockMode = 'Shared';
COMMIT TRAN;
GO
BEGIN TRAN;
EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks2012',
@LockMode = 'Shared';
COMMIT TRAN;
GO