SQLite veritabanı kilitlerini nasıl önleyebilirim?


11

SQLite SSS'den şunu biliyordum:

Birden çok işlem aynı veritabanını aynı anda açabilir. Birden çok işlem SELECTaynı anda yapılabilir. Ancak veritabanında herhangi bir anda yalnızca bir işlem değişiklik yapabilir.

Yani, bildiğim kadarıyla elimden anladığım kadarıyla: 1) Okuma birden çok iş parçacığı db ( SELECT) birden çok iş parçacığı 2) Okuma db ( SELECTtek iplikle) ve yazma ( CREATE, INSERT, DELETE)

Ancak, okuyucular yazarları ve bir yazar okuyucuları engellemediğinden , daha fazla eşzamanlılık sağlayan Yazma Öncesi Günlüğü hakkında okudum . Okuma ve yazma aynı anda devam edebilir.

Ben bulduğumda Son olarak, tamamen bulanık var ettik bunu belirtilen zaman:

SQLITE_LOCKED hatası almanın diğer nedenleri:

  • Çalışılıyor CREATEveya DROPbir süre bir tablo ya da dizin SELECTdeyimi hala beklemede.
  • SELECTAynı tabloda a etkinken bir tabloya yazmaya çalışıyorum .
  • SELECTEğer sqlite bunu yapmaya ayarlanmamışsa, çoklu iş parçacıklı bir uygulamada aynı anda aynı tabloda iki tane yapmaya çalışın.
  • fcntl (3, DB dosyasındaki F_SETLK çağrısı başarısız oluyor. Bunun nedeni bir NFS kilitleme sorunu olabilir. Bu sorunun bir çözümü DB'yi uzaklaştırmak ve yeni bir Inode değerine sahip olacak şekilde geri kopyalamaktır

Yani, kendim için açıklığa kavuşturmak istiyorum, kilitten kaçınmak gerekiyor mu? İki farklı konuyu aynı anda okuyabilir ve yazabilir miyim? Teşekkürler.

Yanıtlar:


9

Bağladığınız bu sayfa, oldukça eski olmanın yanı sıra, aynı işlemden aynı veritabanı bağlantısı üzerinden (veya kullanmamanız gereken paylaşılan önbellek modunda çoklu bağlantılar aracılığıyla) erişimden bahseder .

WAL modunda değilken, aynı veritabanından birden fazla bağlantı okunabilir, ancak bir yazma işlemi özeldir, başka bir okuyucuya veya yazıcıya izin verilmez.

WAL modunda, bir yazar ve okuyucular birbirlerini engellemez, ancak yine de yalnızca bir yazara izin verilir.


1
Paylaşılan önbellek modundaki sorun nedir? Aynı süreçte birden fazla python iş parçacığı ile bir tablo için bir joblb Paralel döngü ile yazmak mümkün . Bir set kadar kilitleme sorunları vardı isolation_level=None. Paylaşılan önbellek modu olmadan örnekleri iş parçacıkları arasında nasıl paylaşabilirim?
Justin Dearing

1
Dokümantasyon dezavantajları açıklar. Kilitlenmeleri nasıl önleyeceğinizi bilmiyorsanız özellikle tehlikelidir.
CL.

Partiye çok geç geliyor, ama bu bağlantı faydalı. manski.net/2012/10/sqlite-performance
infocyde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.