İlişkisel veritabanları bağlamında kilitlenme , iki veya daha fazla işlemin tablo satırları veya kilitlenebilir nesneler gibi paylaşılan kaynaklar üzerinde özel kontrol için rekabet ettiği ve her işlemin diğerinin kilidi açmasını beklediği ve bunun sonucunda ortaya çıkan bir durumdur. sonsuz bir bekleme döngüsünde. Kilitlenmeler, aynı kaynakları çelişkili bir şekilde kilitlemeye çalışan işlemlerin eş zamanlı yürütülmesi nedeniyle ortaya çıkar, etkilenen işlemlerin tamamen durmasına neden olur ve sonuç olarak sistemin genel performansını ve istikrarını etkiler.
Kilitlenmeler veritabanlarında yaygın bir sorundur ve çeşitli senaryolarda ortaya çıkabilir; örneğin, birden fazla işlem aynı kaynaklar üzerinde farklı bir sırayla kilitlenme talep ettiğinde veya karmaşık bir işlem ağı bunlar arasında döngüsel bir bağımlılık oluşturduğunda. Kilitlenmelerin oluşmasını en aza indirmek için, veritabanı sistemleri çeşitli kilitlenme önleme ve tespit tekniklerinin yanı sıra, kilitlenmeleri ortaya çıktıklarında çözecek mekanizmalar da uygular. Bu teknikler arasında kilit zaman aşımı, kilitlenme algılama algoritmaları ve işlem geri alma veya bekleme grafiği analizi aracılığıyla kilitlenme çözümlemesi yer alır.
AppMaster no-code platformunda, Go programlama dili kullanılarak oluşturulan arka uç uygulamaları, birincil depolama çözümü olarak PostgreSQL uyumlu veritabanlarıyla etkileşime girer. Sağlam ve etkili bir ilişkisel veritabanı yönetim sistemi (RDBMS) olan PostgreSQL, aynı anda yürütülen işlemler arasında izolasyon sağlamak için çok sürümlü eşzamanlılık kontrolü (MVCC) ve açık kilitleme gibi çeşitli eşzamanlılık kontrol mekanizmalarını kullanır. Ancak bu mekanizmalar belirli koşullar altında kilitlenmelere de yol açabilir.
Örneğin, R1 ve R2 olmak üzere iki kaynak üzerinde çalışan T1 ve T2 adlı iki işlemi düşünün. T1 İşlemi, R1 üzerinde bir kilit alır ve ardından R2'yi kilitlemeye çalışır; T2 İşlemi ise R2 üzerinde bir kilit alır ve ardından R1'i kilitlemeye çalışır. Her iki işlem aynı anda çalışırsa, her iki işlem de süresiz olarak diğerinin kilidini açmasını bekleyeceğinden ve döngüsel bir bağımlılık yaratacağından bir kilitlenme meydana gelecektir.
Kilitlenmeleri önlemek için geliştiriciler, uygulamalarında çeşitli en iyi uygulamaları ve tasarım ilkelerini benimseyebilir. Bazı yaygın stratejiler şunları içerir:
- Kaynaklara tutarlı bir sırayla erişin: İşlemlerin kaynakları belirli ve tutarlı bir sırayla kilitlediğinden emin olun. Bu, birden fazla işlemin birbirini bekleme olasılığını azaltır ve kilitlenmeleri etkili bir şekilde önler.
- İnce taneli kilitleme kullanın: İşlemler arasındaki kilit çekişmesini ve kilitlenme olasılığını azalttığı için mümkün olduğunda tablo düzeyinde kilitleme yerine satır düzeyinde kilitlemeyi tercih edin.
- Kilitleri erken alın ve hemen serbest bırakın: Başka bir işlem tarafından kilitlenen kaynaklarda eşzamanlı işlemlerin bekleme olasılığını azaltmak için bir kilidin alınması ve serbest bırakılması arasındaki süreyi en aza indirin.
- İşlem boyutunu sınırlayın: Büyük işlemleri daha küçük, daha yönetilebilir parçalara bölün. Daha küçük işlemler, kilitlenmelerle karşılaşma olasılığını azaltır ve genel sistem performansını artırır.
PostgreSQL, kilitlenmeleri tespit etmek ve çözmek için yerleşik mekanizmalar sağlar. Kaynaklar üzerinde kilit bulunduran işlemler arasındaki döngüsel bağımlılıkları periyodik olarak tarayan bir kilitlenme tespit algoritması kullanır. Bir kilitlenme bulunursa PostgreSQL, kilitlenmeyi kırmak için ilgili işlemlerden bir veya daha fazlasını sonlandırarak diğer işlemlerin devam etmesine izin verir. Sonlandırılan işlem bir hata mesajı alır ve uygulama, işlemi yeniden denemeyi veya hatayı uygun şekilde ele almayı seçebilir.
PostgreSQL'in yerleşik yeteneklerine ek olarak, AppMaster tarafından oluşturulan uygulamalar aşağıdakiler gibi çeşitli kilitlenme işleme tekniklerinden de yararlanabilir:
- Zaman aşımı tabanlı kilitlenme çözümü: Her işlem için bir zaman aşımı değeri ayarlayın ve işlemin, belirtilen süre içinde tamamlanmaması durumunda otomatik olarak geri alınmasını sağlayın. Bu, uzun süren işlemlerin kilitlenmeye neden olma olasılığını azaltır.
- Yeniden deneme mekanizmaları: Kilitlenme nedeniyle sonlandırılan bir işlemi otomatik olarak yeniden denemek için uygulama düzeyinde mantık uygulayın. Bu, genel sistem kararlılığının korunmasına ve kullanıcı deneyiminin iyileştirilmesine yardımcı olabilir.
Sonuç olarak kilitlenme, ilişkisel veritabanlarında, paylaşılan kaynaklar için rekabet eden eşzamanlı işlemler nedeniyle ortaya çıkan karmaşık bir sorundur. Kilitlenmeleri etkili bir şekilde ele almak için geliştiricilerin işlem yönetimi ve eşzamanlılık kontrolü ilkelerini anlamaları ve kilitlenmelerin oluşumunu en aza indirecek uygulamaları tasarlamak ve uygulamak için en iyi uygulamaları benimsemeleri gerekir. AppMaster sağlam no-code platformu ve PostgreSQL'in yerleşik mekanizmaları sayesinde geliştiriciler, kilitlenmelere daha az duyarlı, yüksek düzeyde ölçeklenebilir ve performanslı uygulamalar oluşturabilir ve kusursuz bir kullanıcı deneyimi sunabilir.