Dapatkah saya membaca dan menulis ke database SQLite secara bersamaan dari beberapa koneksi?

89

Saya memiliki database SQLite yang digunakan oleh dua proses. Saya bertanya-tanya, dengan versi terbaru SQLite, sementara satu proses (koneksi) memulai transaksi untuk menulis ke database, akankah proses lain dapat membaca dari database secara bersamaan?

sean717
sumber
pertanyaan terkait lihat di sini .. stackoverflow.com/questions/12117016/…
AndroidGeek

Jawaban:

146

Saya mengumpulkan informasi dari berbagai sumber, kebanyakan dari sqlite.org, dan mengumpulkannya:

Pertama, secara default, beberapa proses dapat memiliki database SQLite yang sama yang dibuka pada waktu yang sama, dan beberapa akses baca dapat dipenuhi secara paralel.

Dalam kasus penulisan, satu tulis ke database mengunci database untuk waktu yang singkat, tidak ada, bahkan membaca, dapat mengakses file database sama sekali.

Mulai versi 3.7.0, opsi "Write Ahead Logging" (WAL) baru tersedia, di mana membaca dan menulis dapat dilanjutkan secara bersamaan.

Secara default, WAL tidak diaktifkan. Untuk mengaktifkan WAL, lihat dokumentasi SQLite.

sean717
sumber
jadi secara hipotetis jika Anda harus memecahkan masalah di mana Anda menginginkan data secara lokal tanpa membuatnya dapat diakses oleh masyarakat umum tetapi kemampuan untuk menulis banyak file secara paralel, Anda akan memerlukan satu file database untuk setiap penulisan tersebut sehingga beberapa penulisan dapat terjadi secara bersamaan. Apakah itu? Saya tahu banyak file biasanya tidak disukai, tetapi saya mencoba mencari cara untuk melakukan banyak penulisan dari tugas seledri tanpa menggunakan database sisi server karena saya memerlukan data hanya untuk komputasi lokal
PirateApp
Ada pragma, locking_mode = eksklusif yang dapat digunakan untuk mengunci database ke satu proses, jika Anda ingin mencegah fungsionalitas ini.
Scovetta
20

SQLite3 secara eksplisit mengizinkan banyak koneksi :

(5) Dapatkah beberapa aplikasi atau beberapa contoh dari aplikasi yang sama mengakses file database tunggal pada waktu yang sama?

Beberapa proses dapat membuka database yang sama pada waktu yang sama. Beberapa proses dapat melakukan PILIHAN pada saat yang bersamaan. Namun, hanya satu proses yang dapat membuat perubahan pada database setiap saat.

Untuk berbagi koneksi, gunakan cache bersama SQLite3 :

Dimulai dengan versi 3.3.0, SQLite menyertakan mode "cache bersama" khusus ( dinonaktifkan secara default )

Di versi 3.5.0, mode cache bersama telah dimodifikasi sehingga cache yang sama dapat dibagikan ke seluruh proses, bukan hanya dalam satu utas.

5.0 Mengaktifkan Mode Cache Bersama

Mode cache bersama diaktifkan per proses. Dengan menggunakan antarmuka C, API berikut dapat digunakan untuk mengaktifkan atau menonaktifkan mode cache bersama secara global:

int sqlite3_enable_shared_cache (int);

Setiap panggilan sqlite3_enable_shared_cache () mempengaruhi koneksi database selanjutnya yang dibuat menggunakan sqlite3_open (), sqlite3_open16 (), atau sqlite3_open_v2 (). Koneksi database yang sudah ada tidak terpengaruh. Setiap panggilan ke sqlite3_enable_shared_cache () menimpa semua panggilan sebelumnya dalam proses yang sama.

Arun
sumber