Genel
InnoDB Lock Mekanizmaları: Record, Gap ve Next-Key Locks’ın Derinlemesine İncelenmesi

Veritabanlarında eşzamanlı işlemler kaçınılmazdır. Birden fazla kullanıcı aynı anda aynı tabloya eriştiğinde, verilerin bütünlüğünü koruyabilmek için lock mekanizmaları devreye girer. InnoDB bu konuda oldukça gelişmiş bir yapıya sahiptir.
Bu yazıda, InnoDB’nin record locks, gap locks, next-key locks ve diğer özel lock türlerini örnekler üzerinden inceleyeceğiz. Ayrıca deadlock senaryosu üzerinden neler yaşanabileceğini göstereceğiz.
1. Lock’ları Nerede Görüyoruz?
InnoDB’nin oluşturduğu lock’ları izlemek için:
Bu sorgunun oluşturduğu lockları bir inceleyelim. Örneğin şu sorguyu çalıştırdığımızda:
Thread id sinin 111 olduğunu varsaydığımızda aşağıdaki satırları göreceğiz.
lock_mode: IX→ Tablo düzeyinde “bu tabloda satır kilitlendi” sinyalilock_mode: X,REC_NOT_GAP→ Satır üzerinde doğrudan locklock_mode: X,GAP→ Satırlar arasındaki boşluğu (gap) kilitlemelock_mode: X,INSERT_INTENTION→ Insert denemesi için bekleyen lock
2. Record Locks ve Next-Key Locks
Record Lock: Belirli bir satırın kilitlenmesidir.
Next-Key Lock: Record lock + gap lock kombinasyonudur.
Next-key lock sayesinde yalnızca seçilen satır değil, aynı zamanda onun etrafındaki boşluk da kilitlenir. Böylece phantom read (hayalet kayıt) problemleri engellenir.
Gap Locks
Gap lock, bir satırın kendisini değil, onun öncesindeki veya sonrasındaki boşluğu kilitler.
Örnek:
Bu update table_xxx tablosundaki id si 100 ile 200 arası tüm kayıtlara update sırasında ya da transaction içerisinde lock koyar.
Burada tipik bir senaryo şu şekildedir:
id auto_increment bir alandır. 150 de bittiğini varsayalım.
yukarda verilen update bir transaction içerisinde çalıştırılır ama commitlenmez, ya da update uzun sürer.
başka bir transaction da aynı tabloya bir insert gelir. endirek olarak autoincrement ten dolayı id 151 i almaya çalışır ve lock ta kalır.
çalışan querylere bakınca bu insert i kilitleyecek hiç bir sorgu yokmuş gibidir ama gap lock oradadır ve sinsi sinsi kilidi vurmuştur :)
4. Insert Intention Locks
Bir transaction belirli bir aralığa yeni satır eklemek isterse, InnoDB insert intention lock oluşturur. Bu lock, gerçek bir engelleme değil, daha çok “bekleme sırası” bilgisidir. Özellikle auto_increment alma, semaforlar ya da index güncellemeler gibi işlemlerin oluşturduğu mini beklemeler gibi düşünülebilir.
Faydalı tarafı, birden fazla transaction’ın aynı aralığa insert denemesi yapabilmesini sağlar ve deadlock riskini azaltır.
5. Deadlock Senaryosu
Deadlock, iki transaction’ın karşılıklı olarak birbirini beklemesiyle oluşur.
Örnek:
Ardından taraflar birbirinin satırını güncellemeye çalışır:
Transaction 1:
Transaction 2:
Daha sonra her iki işlem de birbirinin satırını güncellemeye çalışır:
T1 →
UPDATE city SET CountryCode = 'CCC' WHERE ID = 2002;T2 →
UPDATE city SET CountryCode = 'DDD' WHERE ID = 1001;
Ardından taraflar birbirinin satırını güncellemeye çalışır:
T1 →
UPDATE city SET CountryCode = 'CCC' WHERE ID = 2002;T2 →
UPDATE city SET CountryCode = 'DDD' WHERE ID = 1001;
Sonuç: Deadlock ❌
InnoDB durumu algılar ve transactionlardan birini geri alır.
6. Deadlock Önleme İpuçları
Erişim sırasını sabitleyin (tüm transaction’lar tabloları aynı sırada güncellesin).
Kısa transaction’lar kullanın (lock süresini azaltır).
Okuma ve yazmayı ayırın.
İzolasyon seviyesini dikkatli seçin (
READ COMMITTEDbazı durumlarda daha güvenli olabilir)
Sonuç
InnoDB, satır bazlı lock mekanizmasını çok esnek kullanarak:
Record Locks ile satırları,
Gap Locks ile satırlar arasındaki boşlukları,
Next-Key Locks ile ikisini birden,
Insert Intention Locks ile ekleme denemelerini
kontrol altına alır.
Bu güçlü yapı sayesinde veri tutarlılığı korunur, ancak aynı zamanda deadlock riski de beraberinde gelir. Dolayısıyla geliştiricilerin bu lock türlerini anlaması, performanslı ve güvenilir transaction tasarımı için kritik öneme sahiptir.






