Aracılığıyla paylaş


APPLOCK_MODE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bu fonksiyon, kilit sahibinin belirli bir uygulama kaynağında tuttuğu kilit modunu geri döndürür. Bir uygulama kilidi fonksiyonu olarak, APPLOCK_MODE mevcut veritabanında çalışır. Veritabanı, uygulama kilitlerinin kapsamıdır.

Transact-SQL söz dizimi kuralları

Sözdizimi

APPLOCK_MODE( 'database_principal' , 'resource_name' , 'lock_owner' )  

Arguments

'database_principal'
Veritabanındaki nesnelere izin verilebilecek kullanıcı, rol veya uygulama rolü. Fonksiyonu başarılı bir şekilde çağırmak için, fonksiyon çağıran kişi database_principal, dbo veya db_owner sabit veritabanı rolünün bir üyesi olmalıdır.

'resource_name'
İstemci uygulaması tarafından belirtilen bir kilit kaynak adı. Uygulama, benzersiz bir kaynak adı sağlamalıdır. Belirtilen isim, SQL Server kilit yöneticisinin dahili olarak depolayabileceği bir değere dahili olarak hash edilir. resource_namenvarchar(255)'dir ve varsayılan yoktur. resource_name ikili karşılaştırmadır ve mevcut veritabanının derleme ayarlarından bağımsız olarak büyük harf duyarlıdır.

'lock_owner'
Kilidin sahibi, ki kilit istendiğinde lock_owner değerdir. lock_ownernvarchar(32)'dir ve değer ya Transaction (varsayılan) ya da Session olabilir.

Dönüş türleri

nvarchar(32)

Dönüş değeri

Belirli bir uygulama kaynağında kilit sahibinin tuttuğu kilit modunu döndürür. Kilitleme modu şu değerlerden herhangi birine sahip olabilir:

NoLock
Update
*Paylaşılan NiyetÖzel

IntentShared
IntentExclusive
*Niyeti GüncellemeÖzel

Paylaşılan
Seçkin

*Bu kilit modu, diğer kilit modlarının bir kombinasyonudur ve sp_getapplock bunu açıkça edinemez.

Fonksiyon özellikleri

Nondeterministic

Indekslenebilir değil

Paralelleştirilemeyen

Örnekler

İki kullanıcı (Kullanıcı A ve Kullanıcı B), ayrı oturumlarla, aşağıdaki Transact-SQL ifadesi dizisini çalıştırır.

Kullanıcı A şunları çalıştırıyor:

USE AdventureWorks2022;  
GO  
BEGIN TRAN;  
DECLARE @result INT;  
EXEC @result=sp_getapplock  
    @DbPrincipal='public',  
    @Resource='Form1',  
    @LockMode='Shared',  
    @LockOwner='Transaction';  
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');  
GO  

Kullanıcı B daha sonra şunları çalıştırıyor:

Use AdventureWorks2022;  
GO  
BEGIN TRAN;  
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');  
--Result set: NoLock  
  
SELECT APPLOCK_TEST('public', 'Form1', 'Shared', 'Transaction');  
--Result set: 1 (Lock is grantable.)  
  
SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');  
--Result set: 0 (Lock is not grantable.)  
GO  

Kullanıcı A daha sonra şunları çalıştırıyor:

EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';  
GO  

Kullanıcı B daha sonra şunları çalıştırıyor:

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');  
--Result set: '1' (The lock is grantable.)  
GO  

Kullanıcı A ve Kullanıcı B daha sonra şunları çalıştırır:

COMMIT TRAN;  
GO  

Ayrıca bakınız

APPLOCK_TEST (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)