Ana Sayfa

Rust SQLx ve SQLite: Yazma İşlemlerinde Performans Tuzağı

1 dk okuma

SQLx, popüler bir async Rust SQL kütüphanesi ile SQLite kullanırken, yazma işlemleri (write transactions) ciddi performans düşüşlerine ve kilit açlığına (lock starvation) yol açabilen bir 'ayak tabancası' (footgun) durumuna dönüşebilir. SQLite, doğası gereği tek yazıcılı bir veritabanıdır. WAL (Write-Ahead Logging) modunda bile aynı anda yalnızca bir yazma işlemi gerçekleşebilir. Bir yazma işlemi başlamadan önce, veritabanı üzerinde özel (EXCLUSIVE) bir kilit elde etmesi gerekir. Bir okuma işlemiyle başlayan ve daha sonra aynı işlem içinde yazmaya yükseltilen bir işlem genellikle sorun yaratmaz. Ancak, sorun, bir yazma işlemi içinde birden fazla await çağrısı yapıldığında ortaya çıkar.

Örneğin, bir işlem içinde birden fazla INSERT veya UPDATE ifadesi döngü içinde await ile çağrıldığında, ilk yazma ifadesiyle birlikte veritabanı özel bir kilit altına alınır. await çağrısı yapıldığında, mevcut görev (task) kontrolü async runtime'a geri verir. Bu sırada, veritabanı hala özel kilit altında kalır. Runtime, başka bir görevi zamanlayabilir ve bu görev de yazma işlemi yapmak isteyebilir. Ancak, kilit tutulduğu için diğer tüm yazıcılar mevcut işlemin tamamlanmasını beklemek zorunda kalır. Bu durum, özellikle eşzamanlı yazma işlemlerinin yoğun olduğu senaryolarda veritabanının kilitlenmesine ve uygulamanın yavaşlamasına neden olur.

Bu tür bir senaryo, özellikle birden fazla eşzamanlı görevin aynı anda veritabanına yazmaya çalıştığı durumlarda ciddi performans sorunlarına yol açar. Geliştiricilerin, SQLx ve SQLite ile yazma işlemleri tasarlarken await çağrılarının kilitlenme davranışını dikkatle değerlendirmeleri ve uzun süreli kilit tutmaktan kaçınmaları gerekmektedir. Aksi takdirde, beklenmedik performans darboğazları ve uygulama yanıt sürelerinde artış yaşanabilir.

İçgörü

Bu durum, özellikle yüksek eşzamanlılık gerektiren uygulamalarda ciddi performans darboğazlarına yol açabilir ve veritabanı kilitlenmelerine neden olabilir.

Kaynak