Kilitlenme kavramı
Kilitlenme: Kilitlenme genellikle birbirlerinin kaynaklarını bekleyen ve sonunda bir döngü oluşturan işlemlerden kaynaklanır.
Kilitlenme için, veritabanı işleme yöntemi: başka bir bağlantının başarılı bir şekilde yürütülmesini sağlamak için bir bağlantıyı feda etmek.
Bir kilitlenme durumunda, ERROR: 1213 döndürür. InnoDB depolama motoru, çoğu kilitlenmeyi algılayabilir ve insan müdahalesi gerektirmez.
Not:
InnoDB depolama motoru, engelleme bölümündeki örnekte olduğu gibi hata istisnalarının çoğunu geri almaz, ancak kilitlenmeler hariçtir.Bir kilitlenme bulunduğunda, InnoDB depolama motoru bir işlemi hemen geri alır ve bir 1213 hatası verir.
Kilitlenme durumlarına örnekler
eg1:
Kilitlenme günlüğünü analiz edin:
ilk kısım
Günlükten, işlem 1'in şu anda info_users set mobile = '18514656666' güncellemesini yürüttüğünü görebiliriz, burada mobile = '18514656620', bu ifade tablo info_users'ın IDX_MOBILE endeksinin X kilidi için geçerlidir, bu nedenle lock_mode X bekleme
ikinci kısım:
Ardından, günlüğün alt kısmında işlem 2 için mevcut "tutulan kilitler" ve "bekleyen kilitler" gösterilir:
Günlüğün HOLDS THE LOCKS (S) bloğundan, işlem 2'nin IDX_MOBILE indeksinin X kilidini tuttuğunu ve bunun bir kayıt kilidi olduğunu görebiliriz. Kilit, 2. adımda işlem 2 tarafından yürütülen güncelleme ifadesiyle uygulanır.
Günlüğün BU KİLİT VERİLMESİ BEKLENMESİ bloğundan, işlem 2'nin bilgi_are tablosunun GEN_CLUST_INDEX endeksini tutan X kilidi için uygulandığını görebiliriz. Kilit, id = 1; ifadesi yer alan info_area'dan silme işlemi ile uygulanır.
eg2:
eg3:
Kilitlenme günlüğünü analiz edin:
ilk kısım
Günlükten, işlem 1'in şu anda kullanıcılardan DELETE'i yürüttüğünü görebiliriz, burada uid = 'bbb';, bu ifade UID dizininin X kilidi için geçerlidir, bu nedenle kilit_modu X beklemesini ister
ikinci kısım:
Ardından, günlüğün alt kısmında işlem 2 için mevcut "tutulan kilitler" ve "bekleyen kilitler" gösterilir:
Günlüğün HOLDS THE LOCKS (S) bloğundan, işlem 2'nin UID indeksinin X kilidini tuttuğunu ve bunun bir kayıt kilidi olduğunu görebiliriz. Kilit, 2. adımda işlem 2 tarafından yürütülen silme ifadesi tarafından uygulanır.
Günlüğün BU KİLİT VERİLECEK BEKLENMESİ bloğundan, işlem 2'nin INTO users VALUES (2, 'bbb'); deyimi tarafından uygulanan UID dizinini tutan S kilidi için uygulandığını görebiliriz. Ek deyimi normal koşullar altında bir X kilidi için geçerli olacaktır, ancak burada bir S kilidi görünür. Bunun nedeni, uid alanının bir dizin olmasıdır, bu nedenle, insert deyimi eklemeden önce yinelenen bir anahtar denetimi gerçekleştirecektir. Bu denetimi başarılı kılmak için, diğer işlemlerin uid alanını değiştirmesini önlemek için bir S kilidi başvurmanız gerekir.
Peki S kilidi neden başarısız oluyor? Bu, sıraya alınması gereken aynı alan için kilit uygulamasıdır. S kilidinden önce başarısız bir X kilidi vardır, bu nedenle S kilidinin beklemesi gerekir, böylece dairesel bir bekleme oluşur ve bir kilitlenme oluşur.
Kilitlenme günlüğünü okuyarak, iki işlemin ne tür bir döngüsel bekleme oluştuğunu net bir şekilde anlayabilir ve sonra analiz ederek döngüsel beklemenin nedenini, yani kilitlenmenin nedenini tersine çıkarabiliriz.