Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Bir uygulama kaynağına kilitleme yerleştirir.
Transact-SQL söz dizimi kuralları
Sözdizimi
sp_getapplock
[ [ @Resource = ] N'Resource' ]
, [ @LockMode = ] 'LockMode'
[ , [ @LockOwner = ] 'LockOwner' ]
[ , [ @LockTimeout = ] LockTimeout ]
[ , [ @DbPrincipal = ] N'DbPrincipal' ]
[ ; ]
Arguments
[ @Resource = ] N'Resource'
Kilit kaynağını tanımlayan bir isim belirten bir dizidir.
@Resourcenvarchar(255)'dir, varsayılan olarak NULL. Bir kaynak dizisi nvarchar(255)'den uzunsa, değer nvarchar(255)'e kısılır.
Uygulama, kaynak adının benzersiz olmasını sağlamalıdır. Belirtilen isim, SQL Server kilit yöneticisinde depolanabilecek bir değere dahili olarak hash edilir.
@Resource ikili karşılaştırmadır ve bu nedenle mevcut veritabanının derleme ayarlarından bağımsız olarak büyük harf duyarlıdır.
Uyarı
Bir uygulama kilidi alındıktan sonra, sadece ilk 32 karakter düz metin olarak alınabilir; geri kalan kısım hash edilecek.
[ @LockMode = ] 'LockMode'
Belirli bir kaynak için elde edilecek kilit modu. @LockMode , varsayılma olmayan varchar(32)'dir ve aşağıdaki değerlerden biridir:
SharedUpdateIntentSharedIntentExclusiveExclusive
Daha fazla bilgi için kilitleme modlarına bakınız.
[ @LockOwner = ] 'Kilit Sahibi'
Kilidin sahibi, ki kilit istendiğinde @LockOwner değerdir.
@LockOwnervarchar(32)'dir ve varsayılan olarak ' Transactiondir. Değer ayrıca olabilir Session.
@LockOwner değeri varsayılan olarak veya açıkça belirtildiğindeTransaction, sp_getapplock işlem içinden yürütülmelidir.
[ @LockTimeout = ] LockTimeOut
Milisaniyeler cinsinden bir kilitlenme süresi.
@LockTimeoutint'tir ve varsayılan değer, 'nin @@LOCK_TIMEOUTdöndürülen değeriyle aynıdır. (Default) değeri -1 , süre aşımı olmadığını (yani sonsuza kadar beklemek) anlamına gelir. Bir kilit talebinin, istek hemen -1verilemediğinde kilidi beklemek yerine geri dönüş kodunu döndürmesi gerektiğini 0 belirtmek için .
[ @DbPrincipal = ] N'DbPrincipal'
Veritabanındaki bir nesneye verilen izinler olan kullanıcı, rol veya uygulama rolü.
@DbPrincipalsysname'dir ve varsayılan olarak .public Fonksiyonu arayan kişinin database_principal, dbo veya db_owner sabit veritabanı rolünün üyesi olması gerekir ki fonksiyonu başarılı şekilde çağırabilsin. Varsayılan kamuya açıktır.
Dönüş kodu değerleri
>= 0 (başarı), ya < 0 da (başarısızlık).
| Değer | Result |
|---|---|
0 |
Kilit eşzamanlı olarak başarıyla verildi. |
1 |
Diğer uyumsuz kilitlerin açılması beklendikten sonra kilit, başarıyla onaylandı. |
-1 |
Kilit talebi zamanla doldu. |
-2 |
Kilit talebi iptal edildi. |
-3 |
Kilit talebi çıkmaz kurbanı olarak seçildi. |
-999 |
Parametre doğrulaması veya başka bir çağrı hatasını gösterir. |
Açıklamalar
Bir kaynağa yerleştirilen kilitler, ya mevcut işlem ya da mevcut oturumla ilişkilendirilir. Mevcut işlemle ilişkili kilitler, işlem commit yaptığında veya geri çekildiğinde serbest bırakılır. Oturuma bağlı kilitler, oturum çıkışı sırasında serbest bırakılır. Sunucu herhangi bir nedenle kapandığında tüm kilitler açılır.
Oluşturulan sp_getapplock kilit kaynağı, oturum için mevcut veritabanında oluşturulur. Her kilit kaynağı, aşağıdaki birleşik değerlerle tanımlanır:
- Kilit kaynağını içeren veritabanının veritabanı kimliği.
- @DbPrincipal parametresinde belirtilen veritabanı prensibi.
- Parametrede @Resource belirtilen kilit adı.
Yalnızca @DbPrincipal parametresinde belirtilen veritabanı ana üyesinin bir üyesi, o prensibi belirten uygulama kilitlerini edinebilir. DBO ve db_owner rollerinin üyeleri örtük olarak tüm rollerin üyeleri olarak kabul edilir.
Kilitler açıkça .sp_releaseapplock Bir uygulama aynı kilit kaynağı için birden fazla kez çağrıldığında sp_getapplock , sp_releaseapplock kilidin serbest bırakılması için aynı sayıda kez çağrılmalıdır. Kilit sahibi ile bir kilit açıldığında Transaction , işlem yapıldığında veya geri alındığında o kilit serbest bırakılır.
Eğer sp_getapplock aynı kilit kaynağı için birden fazla kez çağrılırsa, ancak herhangi bir istekte belirtilen kilit modu mevcut modla aynı değildir; kaynak üzerindeki etkisi iki kilit modunun birleşimidir. Çoğu durumda, bu kilitleme modunun daha güçlü kilitli modlara, mevcut moda veya yeni istenen moda terfi ettirilmesi anlamına gelir. Bu güçlü kilit modu, kilit açılana kadar tutulur, kilit bırakma çağrıları o zamandan önce olsa bile.
Örneğin, aşağıdaki çağrı dizisinde, kaynak modda değil Exclusive modda tutulurShared.
USE AdventureWorks2022;
GO
BEGIN TRANSACTION;
DECLARE @result AS INT;
EXECUTE
@result = sp_getapplock
@Resource = 'Form1',
@LockMode = 'Shared';
EXECUTE
@result = sp_getapplock
@Resource = 'Form1',
@LockMode = 'Exclusive';
EXECUTE
@result = sp_releaseapplock
@Resource = 'Form1';
COMMIT TRANSACTION;
GO
Uygulama kilidi olan çıkmaz, uygulama kilidini talep eden işlemi geri alamaz. Geri dönüş değeri nedeniyle gerekli olabilecek geri alım manuel olarak yapılmalıdır. Bu nedenle, hata kontrolünün kodda yer almasını öneriyoruz; böylece belirli değerler dönerse (örneğin, -3), bir ROLLBACK TRANSACTION veya alternatif bir eylem başlatılır.
İşte bir örnek:
USE AdventureWorks2022;
GO
BEGIN TRANSACTION;
DECLARE @result AS INT;
EXECUTE
@result = sp_getapplock
@Resource = 'Form1',
@LockMode = 'Exclusive';
IF @result = -3
BEGIN
ROLLBACK;
END
ELSE
BEGIN
EXECUTE
@result = sp_releaseapplock
@Resource = 'Form1';
COMMIT TRANSACTION;
END
GO
SQL Server, kaynağı nitelendirmek için mevcut veritabanı kimliğini kullanır. Bu nedenle, sp_getapplock farklı veritabanlarında aynı parametre değerleri olsa bile, sonuç ayrı kaynaklarda ayrı kilitler olur.
Kilit bilgilerini incelemek için sys.dm_tran_locks dinamik yönetim görünümünü veya sp_lock sistem depolanmış prosedürünü kullanın, ya da kilitleri izlemek için SQL Server Profiler kullanın.
Permissions
"" genel "" rolüne üyelik gerektirir.
Örnekler
Aşağıdaki örnek, mevcut işlemle ilişkilendirilen paylaşılan bir kilidi veritabanındaki kaynağa Form1AdventureWorks2025 yerleştirir.
USE AdventureWorks2022;
GO
BEGIN TRANSACTION;
DECLARE @result AS INT;
EXECUTE
@result = sp_getapplock
@Resource = 'Form1',
@LockMode = 'Shared';
COMMIT TRANSACTION;
GO
Aşağıdaki örnek, veritabanı prensibi olarak belirtilmiştir dbo .
BEGIN TRANSACTION;
EXECUTE sp_getapplock
@DbPrincipal = 'dbo',
@Resource = 'AdventureWorks2022',
@LockMode = 'Shared';
COMMIT TRANSACTION;
GO