APPLOCK_TEST (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Fungsi ini mengembalikan informasi tentang apakah kunci dapat diberikan pada sumber daya aplikasi tertentu atau tidak, untuk pemilik kunci tertentu, tanpa akuisisi kunci. Sebagai fungsi kunci aplikasi, APPLOCK_TEST beroperasi pada database saat ini. Database adalah cakupan kunci aplikasi.

Konvensi sintaks transact-SQL

Sintaksis

APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

'database_principal'
Peran pengguna, peran, atau aplikasi yang dapat diberikan izin ke objek dalam database. Agar berhasil memanggil fungsi, pemanggil fungsi harus menjadi anggota database_principal, dbo, atau peran database tetap db_owner.

'resource_name'
Nama sumber daya kunci yang ditentukan oleh aplikasi klien. Aplikasi harus memastikan nama sumber daya yang unik. Nama yang ditentukan di-hash secara internal ke dalam nilai yang dapat disimpan oleh manajer kunci SQL Server secara internal. resource_name adalah nvarchar(255), tanpa default. resource_name dibandingkan biner, dan peka huruf besar/kecil terlepas dari pengaturan kolater database saat ini.

'lock_mode'
Mode kunci yang akan diperoleh untuk sumber daya tertentu. lock_mode adalah nvarchar(32), tanpa nilai default. lock_mode dapat memiliki salah satu nilai ini: Bersama, Pembaruan, IntentShared, IntentExclusive, Eksklusif.

'lock_owner'
Pemilik kunci, yang merupakan nilai lock_owner saat kunci diminta. lock_owner adalah nvarchar(32), dan nilainya dapat berupa Transaksi (default) atau Sesi. Jika default atau Transaksi ditentukan secara eksplisit, APPLOCK_TEST harus dijalankan dari dalam transaksi.

Jenis yang dikembalikan

smallint

Nilai hasil

0 jika kunci tidak dapat diberikan kepada pemilik yang ditentukan, atau 1 jika kunci dapat diberikan.

Properti fungsi

Nondeterministik

Tidak dapat dieksfiniskan

Tidak dapat diparallelizable

Contoh

Dua pengguna (Pengguna A dan Pengguna B), dengan sesi terpisah, jalankan urutan pernyataan Transact-SQL berikut.

Pengguna A berjalan:

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  

Pengguna B kemudian menjalankan:

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  

Pengguna A kemudian menjalankan:

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

Pengguna B kemudian menjalankan:

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

Pengguna A dan Pengguna B kemudian menjalankan:

COMMIT TRAN;  
GO  

Baca juga

APPLOCK_MODE (T-SQL)
sp_getapplock (T-SQL)
sp_releaseapplock (T-SQL)