Aracılığıyla paylaş


APPLOCK_TEST (Transact-SQL)

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

Bu fonksiyon, kilidin edinilmeden belirli bir uygulama kaynağında, belirli bir kilit sahibi için verilip verilemeyeceğine dair bilgi sağlar. Bir uygulama kilidi fonksiyonu olarak, APPLOCK_TEST mevcut veritabanında çalışır. Veritabanı, uygulama kilitlerinin kapsamıdır.

Transact-SQL söz dizimi kuralları

Sözdizimi

APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , '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_mode'
Belirli bir kaynak için elde edilecek kilit modu. lock_modenvarchar(32)'dir ve varsayılan değeri yoktur. lock_mode şu değerlerden herhangi birine sahip olabilir: Paylaşılan, Güncellenen, NiyetPaylaşılan, NiyetEksklüziv, Özel değer.

'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. Varsayılan veya İşlem açıkça belirtiliyorsa, APPLOCK_TEST işlem içinden yürütülmelidir.

Dönüş türleri

smallint

Dönüş değeri

Eğer kilit belirtilen sahibine verilemiyorsa 0, kilit verilebiliyorsa 1.

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 her ikisi de şu şekilde çalıştırır:

COMMIT TRAN;  
GO  

Ayrıca bakınız

APPLOCK_MODE (Transact-SQL)
sp_getapplock (Transact-SQL)
sp_releaseapplock (Transact-SQL)