Aynı anda birden çok bağlantıdan bir SQLite veritabanını okuyabilir ve yazabilir miyim?


89

İki işlem tarafından kullanılan bir SQLite veritabanım var. Merak ediyorum, SQLite'ın en son sürümü ile, bir işlem (bağlantı) veritabanına yazmak için bir işlem başlatırken, diğer işlem aynı anda veritabanından okuyabilir mi?


Yanıtlar:


146

Çoğunlukla sqlite.org olmak üzere çeşitli kaynaklardan bilgi topladım ve bunları bir araya getirdim:

İlk olarak, varsayılan olarak, birden çok işlem aynı SQLite veritabanını aynı anda açabilir ve birkaç okuma erişimi paralel olarak karşılanabilir.

Yazma durumunda, veritabanına tek bir yazma, veritabanını kısa bir süre için kilitler, hiçbir şey, okumak bile veritabanı dosyasına erişemez.

3.7.0 sürümünden başlayarak, okuma ve yazmanın aynı anda devam edebileceği yeni bir "Yazma Öncesi Günlüğü" (WAL) seçeneği mevcuttur.

Varsayılan olarak, WAL etkinleştirilmemiştir. WAL'ı açmak için SQLite belgelerine bakın.


Bu nedenle, varsayımsal olarak, verileri yerel olarak istediğiniz bir sorunu genel halk için erişilebilir hale getirmeden çözmek zorunda kaldıysanız, ancak birden çok dosyayı paralel olarak yazabiliyorsanız, bu tür yazma başına bir veritabanı dosyasına ihtiyacınız olacak, böylece birden çok yazma aynı anda gerçekleşebilir. bu mu? Birden fazla dosyanın genellikle hoş karşılanmadığını biliyorum, ancak verilere yalnızca yerel hesaplamalar için ihtiyacım olduğu için sunucu tarafı veritabanı kullanmadan bir kereviz görevinden birden çok yazma yapmanın bir yolunu bulmaya çalışıyorum
PirateApp

Bu işlevselliği önlemek istiyorsanız, veri tabanını tek bir işleme kilitlemek için kullanılabilecek bir pragma, kilitleme_modu = özel vardır.
Scovetta

20

SQLite3 açıkça birden çok bağlantıya izin verir :

(5) Birden çok uygulama veya aynı uygulamanın birden çok örneği, aynı anda tek bir veritabanı dosyasına erişebilir mi?

Birden çok işlem aynı veritabanını aynı anda açabilir. Birden çok işlem aynı anda bir SEÇME gerçekleştirebilir. Ancak herhangi bir anda veri tabanında yalnızca bir işlem değişiklik yapabilir.

Bağlantıları paylaşmak için SQLite3 paylaşılan önbelleğini kullanın :

3.3.0 sürümünden başlayarak, SQLite özel bir "paylaşılan önbellek" modu içerir ( varsayılan olarak devre dışıdır )

3.5.0 sürümünde, paylaşılan önbellek modu değiştirildi, böylece aynı önbellek yalnızca tek bir iş parçacığı içinde değil, tüm süreç boyunca paylaşılabilir.

5.0 Paylaşımlı Önbellek Modunu Etkinleştirme

Paylaşılan önbellek modu, işlem bazında etkinleştirilir. C arayüzünü kullanarak, paylaşılan önbellek modunu global olarak etkinleştirmek veya devre dışı bırakmak için aşağıdaki API kullanılabilir:

int sqlite3_enable_shared_cache (int);

Her çağrı sqlite3_enable_shared_cache (), sqlite3_open (), sqlite3_open16 () veya sqlite3_open_v2 () kullanılarak oluşturulan sonraki veritabanı bağlantılarını etkiler. Zaten var olan veritabanı bağlantıları etkilenmez. Sqlite3_enable_shared_cache () 'ye yapılan her çağrı, aynı süreç içinde önceki tüm çağrıları geçersiz kılar.

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.