Aracılığıyla paylaş


İyileştirilmiş kilitleme

Şunlar için geçerlidir: SQL Server 2025 (17.x) Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

İyileştirilmiş kilitleme, eşzamanlı işlemler için kilit engelleme ve kilit bellek tüketimini azaltmak için geliştirilmiş bir işlem kilitleme mekanizması sunar.

İyileştirilmiş kilitleme nedir?

Optimizasyonlu kilitleme, büyük işlemler için bile çok az sayıda kilit tutularak kilit belleğinin azaltılmasına yardımcı olur. Buna ek olarak, iyileştirilmiş kilitleme, kilit yükseltmelerini önler ve bazı kilitlenme türlerini önleyebilir. Bu, tabloya daha fazla eşzamanlı erişim sağlar.

Optimize edilmiş kilitleme, iki birincil bileşenden oluşur: işlem tanımlayıcısı (TID) kilitleme ve nitelemeden sonra kilitleme (LAQ).

  • İşlem kimliği (TID), bir işlemin benzersiz tanımlayıcısıdır. Her satır, üzerinde değişiklik yapan son TID ile işaretlenmiştir. Büyük olasılıkla çok sayıda anahtar veya satır tanımlayıcısı kilidi yerine, değiştirilen tüm satırları korumak için TID üzerindeki tek bir kilit kullanılır. Daha fazla bilgi için bkz. İşlem Kimliği (TID) kilitleme.
  • Nitelendirmeden Sonra Kilitleme (LAQ), bir kilit edinmeden satırın en son onaylanmış sürümünü kullanarak sorgu koşullarını değerlendiren ve böylece eşzamanlılığı artıran bir iyileştirmedir. LAQ, okuma işlemi yapılan anlık görüntü yalıtımı (RCSI) gerektirir. Daha fazla bilgi için bkz. Vasıflandırmadan sonra kilitleme (LAQ).

Örneğin:

  • İyileştirilmiş kilitleme olmadan, bir tablodaki 1.000 satırı güncelleştirmek, işlemin sonuna kadar tutulan 1.000 özel (X) satır kilidi gerektirebilir.
  • İyileştirilmiş kilitleme ile, bir tablodaki 1.000 satırı güncelleştirmek için 1.000 X satır kilidi gerekebilir, ancak her satır güncelleştirildiğinde her kilit serbest bırakılır ve işlemin sonuna kadar yalnızca bir X TID kilidi tutulur. Kilitler hızlı bir şekilde yayınlandığından, kilit bellek kullanımı azalır ve kilit yükseltme oluşma olasılığı çok daha düşüktür, bu da iş yükü eşzamanlılığını iyileştirir.

Note

İyileştirilmiş kilitlemeyi etkinleştirmek, INSERT, UPDATE, DELETE, MERGEgibi Veri Değiştirme Dili (DML) deyimleri tarafından alınan satır ve sayfa kilitlerini azaltır veya ortadan kaldırır. Şema kilitleri gibi diğer veritabanı ve nesne kilit türleri üzerinde hiçbir etkisi yoktur.

Availability

Aşağıdaki tabloda, SQL platformlarında iyileştirilmiş kilitlemenin kullanılabilirliği ve etkin durumu özetlenmektedir.

Platform Available Varsayılan olarak etkin
Azure SQL Veritabanı Yes Evet (her zaman etkin)
Microsoft Fabric'te SQL veritabanı Yes Evet (her zaman etkin)
Azure SQL Yönetilen ÖrnekAUTD Yes Evet (her zaman etkin)
Azure SQL Yönetilen Örneği2025 Yes Evet (her zaman etkin)
Azure SQL Yönetilen Örnek2022 No N/A
SQL Server 2025 (17.x) Yes Hayır (veritabanı başına etkinleştirilebilir)
SQL Server 2022 (16.x) ve eski sürümler No N/A

Etkinleştirme ve devre dışı bırakma

SQL Server veritabanı için iyileştirilmiş kilitlemeyi etkinleştirmek veya devre dışı bırakmak için komutunu kullanın ALTER DATABASE ... SET OPTIMIZED_LOCKING = ON | OFF . Daha fazla bilgi için bkz. ALTER DATABASE SET seçenekleri.

Optimize edilmiş kilitleme, diğer veritabanı özelliklerine dayanır.

  • İyileştirilmiş kilitlemeyi etkinleştirebilmeniz için önce bir veritabanında hızlandırılmış veritabanı kurtarmayı (ADR) etkinleştirmeniz gerekir. Buna karşılık, ADR'yi devre dışı bırakmak için, önce iyileştirilmiş kilitleme etkinse onu devre dışı bırakmanız gerekir.
  • İyileştirilmiş kilitlemeden en iyi şekilde yararlanmak için okuma anlık görüntü yalıtımı (RCSI), veritabanında etkinleştirilmelidir. İyileştirilmiş kilitlemenin LAQ bileşeni yalnızca RCSI etkinleştirildiğinde etkindir.

ADR, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Microsoft Fabric'teki SQL veritabanında her zaman etkindir. RCSI, Azure SQL Veritabanı'nda ve Microsoft Fabric'teki SQL veritabanında varsayılan olarak etkindir.

Geçerli veritabanınızda bu seçeneklerin etkinleştirildiğini doğrulamak için veritabanına bağlanın ve aşağıdaki T-SQL sorgusunu çalıştırın:

SELECT database_id,
       name,
       is_accelerated_database_recovery_on,
       is_read_committed_snapshot_on,
       is_optimized_locking_on
FROM sys.databases
WHERE name = DB_NAME();

İyileştirilmiş kilitleme etkinleştirildi mi?

Veritabanı başına iyileştirilmiş kilitleme etkinleştirilir. Veritabanınıza bağlanın ve ardından en iyi duruma getirilmiş kilitlemenin etkinleştirilip etkinleştirilmediğini denetlemek için aşağıdaki sorguyu kullanın:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'IsOptimizedLockingOn') AS is_optimized_locking_enabled;
Result Description
0 İyileştirilmiş kilitleme devre dışı bırakıldı.
1 İyileştirilmiş kilitleme etkinleştirildi.
NULL İyileştirilmiş kilitleme kullanılamaz.

Sys.databases katalog görünümünü de kullanabilirsiniz. Örneğin, en iyi duruma getirilmiş kilitlemenin tüm veritabanları için etkinleştirilip etkinleştirilmediğini görmek için aşağıdaki sorguyu yürütür:

SELECT database_id,
       name,
       is_optimized_locking_on
FROM sys.databases;

Kilitlemeye genel bakış

Bu, iyileştirilmiş kilitleme etkinleştirilmediğinde oluşan davranışın kısa bir özetidir. Daha fazla bilgi için İşlem kilitleme ve satır sürümleme kılavuzunugözden geçirin.

Veritabanı altyapısında kilitleme, işlemlerin ACID özelliklerini garanti etmek için birden çok işlemin aynı verileri aynı anda güncelleştirmesini engelleyen bir mekanizmadır.

Bir işlemin verileri değiştirmesi gerektiğinde, veriler üzerinde bir kilit talep eder. Veriler üzerinde başka çakışan kilitler tutulmazsa kilit verilir ve işlem değişiklikle devam edebilir. Veriler üzerinde çakışan başka bir kilit tutulursa, işlemin devam edebilmesi için kilidin serbest bırakılmasını beklemesi gerekir.

Birden çok işlem aynı verilere eşzamanlı olarak erişmeye çalıştığında, veritabanı altyapısının eşzamanlı okuma ve yazma işlemleriyle olası karmaşık çakışmaları çözmesi gerekir. Kilitleme, motorun ANSI SQL işlem yalıtım seviyelerininsemantiğini sağlayabildiği mekanizmalardan biridir. Veritabanlarında kilitleme çok önemli olsa da, düşük eşzamanlılık, kilitlenmeler, karmaşıklık ve kilit yükü performansı ve ölçeklenebilirliği etkileyebilir.

İşlem Kimliği (TID) kilitleme

satır sürüm oluşturma tabanlı yalıtım düzeyleri kullanımda olduğunda veya ADR etkinleştirildiğinde, veritabanındaki her satır dahili olarak bir işlem kimliği (TID) içerir. TID, satırda kalıcıdır. Bir satırı değiştiren her işlem, satırı TID değeriyle damgalar.

TID kilitlemesi ile, satırın anahtarını kilitlemek yerine, satırın TID'sine kilit uygulanır. Değiştiren işlem, TID'si üzerinde bir X kilidi tutar. Diğer işlemler, ilk işlem tamamlanana kadar beklemek için TID üzerinde bir S kilidi edinir. TID kilitleme ile, değişiklikler için sayfa ve satır kilitleri alınmaya devam eder, ancak her satır değiştirildiğinde her sayfa ve satır kilidi serbest bırakılır. İşlem sonuna kadar tutulan tek kilit, TID kaynağındaki tek X kilididir ve birden çok sayfa ve satır (anahtar) kilidini değiştirir.

Yazma işlemi etkinken geçerli oturum için kilitleri gösteren aşağıdaki örneği göz önünde bulundurun:

/* Is optimized locking is enabled? */
SELECT DATABASEPROPERTYEX(DB_NAME(), 'IsOptimizedLockingOn') AS is_optimized_locking_enabled;

CREATE TABLE t0
(
a int PRIMARY KEY,
b int NULL
);

INSERT INTO t0 VALUES (1,10),(2,20),(3,30);
GO

BEGIN TRANSACTION;

UPDATE t0
SET b = b + 10;

SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = @@SPID
      AND
      resource_type IN ('PAGE','RID','KEY','XACT');

COMMIT TRANSACTION;
GO

DROP TABLE IF EXISTS t0;

İyileştirilmiş kilitleme etkinleştirilirse, istek X (işlem) kaynağında yalnızca tek bir XACT kilidi tutar.

Tek bir oturum için sys.dm_tran_locks bir sorgunun sonuç kümesinin ekran görüntüsü, iyileştirilmiş kilitleme etkinleştirildiğinde yalnızca bir kilit gösterir.

İyileştirilmiş kilitleme etkinleştirilmediyse, aynı istek dört kilit tutar: satırları içeren sayfada bir IX (amaç özel kullanım) kilidi ve her satırda üç X anahtar kilidi:

tek bir oturum için sys.dm_tran_locks bir sorgunun sonuç kümesinin ekran görüntüsü, iyileştirilmiş kilitleme etkinleştirilmediğinde üç kilit gösterir.

sys.dm_tran_locks dinamik yönetim görünümü (DMV), kilitleme sorunlarını incelemede veya gidermede yararlıdır. Burada, en iyi duruma getirilmiş kilitlemeyi uygulamada gözlemlemek için kullanılır.

Yeterlilikten sonra kilitle (LAQ)

İyileştirilmiş kilitlemenin LAQ bileşeni, TID altyapısını kullanarak, INSERT, UPDATE ve DELETE gibi DML deyimlerinin kilit alma şeklini değiştirir.

İyileştirilmiş kilitleme olmadan, sorgu önkoşulları önce güncelleştirme (U) satır kilidi alınarak bir taramada satır satır denetlenir. Koşul karşılanırsa, satırı güncelleştirmeden önce özel (X) satır kilidi alınır ve işlem sonuna kadar tutulur.

İyileştirilmiş kilitleme ile ve anlık görüntü yalıtım düzeyi (RCSI) etkinleştirildiğinde, koşullar READ COMMITTED satırın en son işlenmiş sürümünde herhangi bir kilit alınmadan optimizasyonlu olarak denetlenebilir. Koşul karşılamıyorsa, sorgu taramada bir sonraki satıra geçer. Koşul karşılanırsa, satırı güncelleştirmek için bir X satır kilidi alınır.

Başka bir deyişle, değiştirilmek üzere satırın nitelemesi 'den sonra kilit alınır. X satır kilidi, satır güncelleştirmesi tamamlanır tamamlanmaz, işlem bitmeden önce serbest bırakılır.

Koşul değerlendirmesi hiçbir kilit alınmadan gerçekleştirildiğinden, farklı satırları değiştiren eşzamanlı sorgular birbirini engellemez.

Örneğin:

/* Confirm that optimized locking and read committed snapshot isolation (RCSI) are both enabled on this database. */
SELECT database_id,
       name,
       is_accelerated_database_recovery_on,
       is_optimized_locking_on,
       is_read_committed_snapshot_on
FROM sys.databases
WHERE name = DB_NAME();

CREATE TABLE t1
(
a int NOT NULL,
b int NULL
);

INSERT INTO t1
VALUES (1,10),(2,20),(3,30);
GO
Oturum 1 Oturum 2
BEGIN TRANSACTION;
UPDATE t1
SET b = b + 10
WHERE a = 1;
BEGIN TRANSACTION;
UPDATE t1
SET b = b + 10
WHERE a = 2;
COMMIT TRANSACTION;
COMMIT TRANSACTION;

İyileştirilmiş kilitleme olmadan oturum 2 engellenir çünkü oturum 1, 2. oturumun güncelleştirilmesi gereken satırda U bir kilit tutar. Ancak optimize edilmiş kilitleme ile, U kilitler alınmadığı ve 1. satırın en son işlenmiş sürümünde sütun a 1'e eşit olduğu için oturum 2'nin koşulunu karşılamadığından, oturum 2 engellenmez.

LAQ, bir satırın koşulu kontrol edildikten sonra değiştirilmediği varsayımıyla iyimser bir yaklaşımla uygulanır. Koşul karşılanırsa ve koşul denetlendikten sonra satır değiştirilmediyse, bu satır geçerli işlem tarafından değiştirilir.

U Kilitler alınmadığından, koşul değerlendirildikten sonra eşzamanlı bir işlem satırı değiştirebilir. Satırda TID kilidi olan etkin bir X işlem varsa, veritabanı altyapısı işlemin tamamlanmasını bekler. Koşul daha önce değerlendirildikten sonra satır değiştiyse, veritabanı altyapısı satırı değiştirmeden önce koşulu yeniden değerlendirir (yeniden niteler). Koşul yine de karşılanırsa, satır değiştirilir.

Koşul yeniden niteleme, sorgu altyapısı işleçlerinin bir alt kümesi tarafından desteklenir. Önermenin yeniden değerlendirmesi gerekiyorsa, ancak sorgu planı önermenin yeniden nitelendirilmesini desteklemeyen bir operatör kullanıyorsa, veritabanı motoru ifadeyi işlemeyi dahili olarak durdurur ve LAQ olmadan yeniden başlatır. Böyle bir durdurma gerçekleştiğinde, lock_after_qual_stmt_abort genişletilmiş olay tetiklenir.

Değişken ataması olan deyimler ve UPDATE yan tümcesine sahip deyimler gibi bazı deyimler semantikleri değiştirilmeden durdurulamaz ve yeniden başlatılamaz. Bu tür deyimler için LAQ kullanılmaz.

Aşağıdaki örnekte, başka bir işlem satırı değiştirdiğinden koşul yeniden değerlendirilir:

CREATE TABLE t3
(
a int NOT NULL,
b int NULL
);

INSERT INTO t3 VALUES (1,10),(2,20),(3,30);
GO
Oturum 1 Oturum 2
BEGIN TRANSACTION;
UPDATE t3
SET b = b + 10
WHERE a = 1;
BEGIN TRANSACTION;
UPDATE t3
SET b = b + 10
WHERE a = 1;
COMMIT TRANSACTION;
COMMIT TRANSACTION;

Dizin kilitlerini atlama (SIL)

TID kilitleme ile, satırları değiştirmek için kısa süreli münhasır (X) satır kilitleri ve niyet-münhasır (IX) sayfa kilitleri kullanılır. RCSI ve LAQ kullanıldığında, bu kilitler yalnızca satıra erişen ve stabil olmasını bekleyen diğer sorguların olması durumunda gereklidir. Örnek olarak, REPEATABLE READ veya SERIALIZABLE izolasyon düzeylerinde çalışan ya da ilgili kilitleme ipuçlarını kullanan sorgular verilebilir. Bu tür sorgular satır kilitleme sorguları (RLQ) olarak bilinir.

Satıra erişen RLQ sorgusu olmadığında, veritabanı altyapısı bir satırı değiştirirken satır ve sayfa kilitlerini almayı atlayabilir ve yalnızca özel bir sayfa mandalını kullanabilir. Bu iyileştirme, ACID işlem semantiğini korurken kilitleme yükünü azaltır. Satır ve sayfa kilitlerinin atlanması, özellikle çok sayıda satırı değiştiren işlemlere yarar sağlar.

Şu anda SIL iyileştirmesi yalnızca aşağıdaki durumlarda kullanılır:

  • INSERT yığınlar üzerindeki ifadeler.
    • IX sayfa kilitleri atlanır.
  • UPDATE kümelenmiş dizinler, kümelenmemiş dizinler ve yığınlar üzerindeki açıklamalar.
    • IX sayfa kilitleri ve X satır kilitleri atlanır.

SIL iyileştirmesi şu anda aşağıdaki durumlarda kullanılmamakta:

  • DELETE İfadeler.
  • UPDATE satırda mevcut iletme işaretçileri varsa veya güncelleştirme tarafından yeni iletme işaretçileri ekleniyorsa, yığınlardaki ifadeler.
  • Değiştirilen satırda , varchar(max), nvarchar(max)ve varbinary(max)gibi jsonLOB veri türlerini kullanan sütunlar varsa.
  • Aynı işlemle bölünmüş sayfalardaki satırlar için.

LAQ buluşsal yöntemleri

Nitelemeden sonra kilitleme (LAQ) bölümünde açıklandığı gibi, LAQ kullanıldığında, koşulun yeniden değerlendirilmesini desteklemeyen sorgu işleçlerini kullanan deyimler içsel olarak yeniden başlatılabilir ve LAQ olmadan işlenebilir. Bu sık sık gerçekleşirse, yeniden işlemenin yükü önemli hale gelebilir. Ek yükü en aza indirmek için iyileştirilmiş kilitleme, ek yükün eşikleri aşması durumunda LAQ'u devre dışı bırakmaya yönelik buluşsal tabanlı bir geri bildirim mekanizması kullanır.

Geri bildirim mekanizmasının amaçları doğrultusunda, bir deyimin yaptığı iş mantıksal okuma sayısı ile ölçülür. Veritabanı motoru, sorgu işleme başladıktan sonra başka bir işlem tarafından değiştirilen bir satırı değiştiriyorsa, sorgu tarafından yapılan iş, sorgunun yeniden işlenmesi gerekebileceğinden boşa gitmiş gibi kabul edilir.

İfadeler yürütülürken, veritabanı motoru, potansiyel olarak boşa giden işleri, ifadelerin yeniden işlenme durumlarını ve yeniden işlenebilecek ifadeler tarafından yapılan toplam çalışmayı izleyen LAQ geri bildirim verilerini tutar.

Boşa harcanabilecek çalışmanın toplam çalışma oranı veya yeniden işlenen deyim sayısının toplam deyim sayısına oranı ilgili eşikleri aşarsa LAQ devre dışı bırakılır. Bu oranların her ikisi de eşiklerin altına düşerse LAQ yeniden kullanılabilir.

LAQ geri bildirim verileri iki düzeyde izlenir:

  • Sorgu planı için.

    • Veritabanı motoru, ilk kez ifade yeniden işlendiğinde bir plan için LAQ geri bildirimini izlemeye başlar.
    • Sorgu Deposu'nda bir sorgu yakalanırsa, LAQ geri bildirimi de Sorgu Deposu'nda yakalanır. Veritabanı altyapısı, veritabanı yeniden başlatılırsa plan için LAQ'un etkin veya devre dışı kalmasını sağlamak için bu geri bildirimi kullanır.
    • Yakalanan LAQ geri bildirimine sahip sorgu planlarının plan_id katalog görünümünde eşleşen değere sahip bir satırı vardır. feature_id ve feature_desc sütunları sırasıyla 4 ve LAQ Feedback olarak ayarlanır.
  • Veritabanı için.

    • Sorgu planı düzeyinde geri bildirimi olmayan tüm deyimler için, örneğin bir sorgu Sorgu Deposu'nda yakalanmamışsa, geri bildirim toplanır.
    • Geri bildirim veritabanı başlangıcından bu yana izlenir ve her başlatmadan sonra yeniden oluşturulur.

Bir deyim için LAQ kullanıp kullanmamaya karar verirken, sistem varsa sorgu planı geri bildirimini kullanır. Aksi takdirde, veritabanı düzeyinde geri bildirim kullanır. Bu, bazı deyimlerin LAQ ile yürütülebileceği ve bazılarının LAQ olmadan yürütülebileceği anlamına gelir. Örneğin, LAQ bir sorgu planı için devre dışı bırakılmış, veritabanı için etkinleştirilmiştir ve tam tersi de geçerlidir.

LAQ sınırlamaları

Nitelendirmeden sonra kilitleme aşağıdaki senaryolarda kullanılmaz:

  • LAQ sezgisel yöntemleri tarafından devre dışı bırakıldığında.
  • Çakışan kilit ipuçları kullanılırken, UPDLOCK, READCOMMITTEDLOCK, veya XLOCK gibi HOLDLOCK ipuçları kullanılır.
  • İşlem yalıtım düzeyi READ COMMITTED dışında bir değer olduğunda veya READ_COMMITTED_SNAPSHOT veritabanı seçeneği devre dışı bırakıldığında.
  • Tablo üzerinde değişiklik yapıldığında ve bu tablonun bir columnstore dizini varsa.
  • DML deyimi değişken ataması içerdiğinde.
  • DML ifadesinin bir OUTPUT şartı olduğunda.
  • DML deyimi, değiştirilmekte olan satırları okumak için birden fazla dizin arama veya tarama operatörü kullandığında.
  • İçinde MERGE ifadeler.

İyileştirilmiş kilitleme ve RCSI ile sorgu davranışı değişiklikleri

Okunabilir onaylı anlık görüntü yalıtımı (RCSI) altındaki katı işlem yürütme sırasına dayanan eşzamanlı iş yükleri, optimize edilmiş kilitleme etkinleştirildiğinde sorgu davranışında farklılıklar yaşayabilir.

T2 işleminin T1 işlemi sırasında güncelleştirilen sütun t4 temelinde tablo b güncelleştirdiği aşağıdaki örneği göz önünde bulundurun.

CREATE TABLE t4
(
a int NOT NULL,
b int NULL
);

INSERT INTO t4
VALUES (1,1);
GO
Oturum 1 Oturum 2
BEGIN TRANSACTION T1;
UPDATE t4
SET b = 2
WHERE a = 1;
BEGIN TRANSACTION T2;
UPDATE t4
SET b = 3
WHERE b = 2;
COMMIT TRANSACTION;
COMMIT TRANSACTION;

Önceki senaryonun sonucunu nitelendirme sonrası kilit (LAQ) ile ve kilit olmadan değerlendirelim.

LAQ olmadan

LAQ olmadan, T2 işlemindeki UPDATE deyimi engellenir ve T1 işleminin tamamlanmasını bekler. T1 tamamlandıktan sonra T2, koşulu karşılandığından b satır ayarı sütununu 3 olarak güncelleştirir.

her iki işlem de işlendikten sonra tablo t4 aşağıdaki satırları içerir:

 a | b
 1 | 3

LAQ ile

LAQ ile T2 işlemi, sütun b'ın 1'e eşit olduğu satırın en son işlenmiş (commit edilmiş) sürümünü kullanarak koşulunu (b = 2) değerlendirir. Satır uygun değil; bu nedenle atlanır ve ifade T1 işlemi tarafından engellenmeden tamamlanır. Bu örnekte LAQ engellemeyi kaldırır ancak farklı sonuçlara yol açar.

her iki işlem de işlendikten sonra tablo t4 aşağıdaki satırları içerir:

 a | b
 1 | 2

Important

LAQ olmasa bile, satır sürümü tabanlı yalıtım düzeyleri kullanılırken uygulamalar veritabanı motorunun kilitleme ipuçlarını kullanmadan katı bir sıralamayı garanti ettiğini varsaymamalıdır. RCSI altında eşzamanlı iş yükleri çalıştıran ve işlemlerin katı yürütme sırasını kullanan müşterilere yönelik genel önerimiz (önceki örnekte gösterildiği gibi) kullanmaktır.

İyileştirilmiş kilitleme için teşhis eklentileri

Aşağıdaki iyileştirmeler, iyileştirilmiş kilitleme etkinleştirildiğinde engelleme ve kilitlenme sorunlarını izlemenize ve gidermenize yardımcı olur:

  • İyileştirilmiş kilitleme için bekleme türleri
    • XACT TID üzerindeki S kilidi için bekleme türleri ve sys.dm_os_wait_stats içindeki kaynak açıklamaları:
      • LCK_M_S_XACT_READ - Görev, okuma amacıyla XACTwait_resource türünde paylaşılan kilit beklediğinde gerçekleşir.
      • LCK_M_S_XACT_MODIFY - Bir görev, XACTwait_resource türünde değişiklik yapmak amacıyla bir paylaşımlı kilit beklediğinde gerçekleşir.
      • LCK_M_S_XACT - Görev, amacın çıkarılamadığı XACTwait_resource türünde paylaşılan kilit beklerken gerçekleşir. Bu senaryo yaygın değildir.
  • Kaynakların görünürlüğünü kilitleme
    • XACT kaynakları kilitliyor. Daha fazla bilgi için resource_description. sys.dm_tran_locks.
  • Kaynak görünürlüğünü bekleme
    • XACT bekleme kaynakları. Daha fazla bilgi için wait_resource. sys.dm_exec_requests.
  • Kilitlenme grafı
    • <resource-list>kilitlenme raporundaki her kaynağın altında, her <xactlock> öğesi, bir kilitlenmenin her üyesinin kilitleri için temel kaynakları ve belirli bilgileri raporlar. Daha fazla bilgi ve örnek için bkz. Optimizasyonlu kilitleme ve kilitlenmeler.
  • Genişletilmiş olaylar
    • Bir deyim, başka bir işlemle çakışma nedeniyle dahili olarak yeniden işlendiğinde lock_after_qual_stmt_abort olayı tetiklenir. Daha fazla bilgi için bkz. Vasıflandırmadan sonra kilitleme (LAQ).
    • locking_stats olayı, her bir veritabanı için birkaç dakikada bir tetiklenir ve zaman aralığı boyunca toplu kilitleme istatistikleri, örneğin kilit yükselmesi sayısı, optimize edilmiş kilitlemenin TID kilitlemesi ve LAQ bileşenlerinin etkin olup olmadığını, ve çeşitli nedenlerle LAQ'nin kullanılmadığı sorgu sayısı da dahildir. İyileştirilmiş kilitleme devre dışı bırakılsa bile, bu olay tetiklenir.
    • SQL Server ve Azure SQL Yönetilen Örneği'nde locking_stats2 olayı her veritabanı için birkaç dakikada bir tetiklenir ve zaman aralığı için atlama dizin kilitleri ve LAQ heuristik istatistiklerini sağlar.

İyileştirilmiş kilitleme ile en iyi yöntemler

Okundu anlık görüntü yalıtımını (RCSI) etkinleştirme

İyileştirilmiş kilitlemenin avantajlarını en üst düzeye çıkarmak için, veritabanında okuma işlemi yapılan anlık görüntü yalıtımının (RCSI) etkinleştirilmesi ve varsayılan yalıtım düzeyi olarak yalıtımın kullanılması READ COMMITTED önerilir.

Azure SQL Veritabanı'nda ve Microsoft Fabric'teki SQL veritabanında RCSI varsayılan olarak etkindir ve READ COMMITTED varsayılan yalıtım düzeyidir. RCSI etkinleştirildiğinde ve READ COMMITTED yalıtım düzeyini kullanırken, okuyucular ifadeye başlandığında alınan anlık görüntüden satırın bir sürümünü okur. LAQ ile yazılımcılar, satırların en son işlenmiş sürümüne göre ve U kilitleri almadan koşula göre satırları nitelendirir. LAQ ile sorgu, yalnızca satır uygun olduğunda ve o satırda etkin bir yazma işlemi mevcutsa bekler. En son taahhüt edilen sürüme göre nitelendirme ve yalnızca nitelikli satırları kilitleme, engellemeyi azaltır ve eşzamanlılığı artırır.

İpuçlarını kilitlememeye çalışın

İyileştirilmiş kilitleme etkinleştirildiğinde, , UPDLOCK, READCOMMITTEDLOCK, XLOCKgibi HOLDLOCK dikkate alınır, ancak bunlar iyileştirilmiş kilitlemenin avantajını azaltır. Kilit ipuçları, veritabanı motorunu satır veya sayfa kilitleri almaya ve bu kilitleri kilit ipuçlarının amacı doğrultusunda işlem sonuna kadar tutmaya zorlar. Bazı uygulamalar, örneğin UPDLOCK ipucuyla bir satırı okurken ve daha sonra güncelleştirirken kilit ipuçlarının gerekli olduğu bir mantığa sahiptir. Kilit ipuçlarını yalnızca gerektiğinde kullanmanızı öneririz.

İyileştirilmiş kilitleme sayesinde, mevcut sorgularda kısıtlama yoktur ve sorguların yeniden yazılması gerekmez. İpuçları kullanmayan sorgular, en iyi şekilde iyileştirilmiş kilitlemeden yararlanır.

Sorgudaki bir tablodaki tablo ipucu, aynı sorgudaki diğer tablolar için iyileştirilmiş kilitlemeyi devre dışı bırakmaz. Ayrıca, iyileştirilmiş kilitleme yalnızca INSERT, UPDATE, DELETEveya MERGEgibi bir DML deyimi tarafından güncelleştirilen tabloların kilitleme davranışını etkiler. Örneğin:

CREATE TABLE t5
(
a int NOT NULL,
b int NOT NULL
);

CREATE TABLE t6
(
a int NOT NULL,
b int NOT NULL
);
GO

INSERT INTO t5 VALUES (1,10),(2,20),(3,30);
INSERT INTO t6 VALUES (1,10),(2,20),(3,30);
GO

UPDATE t5 SET t5.b = t6.b
FROM t5
INNER JOIN t6 WITH (UPDLOCK)
ON t5.a = t6.a;

Önceki sorgu örneğinde, yalnızca tablo t6 kilitleme ipucundan etkilenirken, t5 hala iyileştirilmiş kilitlemeden yararlanabilir.

UPDATE t5
    SET t5.b = t6.b
FROM t5 WITH (REPEATABLEREAD)
     INNER JOIN t6
         ON t5.a = t6.a;

Önceki sorgu örneğinde, yalnızca tablo t5REPEATABLE READ yalıtım düzeyini kullanır ve işlemin sonuna kadar kilitleri tutar. t5 için yapılan diğer güncelleştirmeler, iyileştirilmiş kilitlemeden yararlanmaya devam edebilir. Aynı durum HOLDLOCK ipucu için de geçerlidir.

Sık sorulan sorular (SSS)

İyileştirilmiş kilitleme hem yeni hem de mevcut veritabanlarında varsayılan olarak açık mı?

Azure SQL Veritabanı'nda, Azure SQL Yönetilen ÖrneğiAUTD'de ve Microsoft Fabric'teki SQL veritabanında evet. SQL Server 2025'te (17.x) iyileştirilmiş kilitleme varsayılan olarak devre dışıdır, ancak hızlandırılmış veritabanı kurtarma özelliği etkinleştirilmiş herhangi bir kullanıcı veritabanında etkinleştirilebilir.

İyileştirilmiş kilitlemenin etkinleştirilip etkinleştirilmediğini nasıl algılayabilirim?

Bkz. İyileştirilmiş kilitleme etkinleştirildi mi?

Optimize edilmiş kilitlemeye rağmen sorguları engellemeye zorlamak istersem ne yapabilirim?

RCSI etkinse, kilitleme optimizasyonu etkinleştirildiğinde iki sorgu arasında engellemeyi zorlamak için READCOMMITTEDLOCK tablo ipucunu kullanın.

İyileştirilmiş kilitleme salt okunur ikincil çoğaltmalarda kullanılıyor mu?

Hayır, çünkü DML ifadeleri salt okunur çoğaltmalarda çalıştırılamaz ve bu nedenle karşılık gelen satır ve sayfa kilitleri alınmaz.

Tempdb'deki ve geçici tablolardaki veriler değiştirilirken iyileştirilmiş kilitleme kullanılıyor mu?

Şu anda yok.