İ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?
İ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:
Ç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.
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.