SQLite dengan dua proses python mengaksesnya: satu membaca, satu tulisan

22

Saya sedang mengembangkan sistem kecil dengan dua komponen: satu jajak pendapat data dari sumber daya internet dan menerjemahkannya ke dalam data sql untuk bertahan secara lokal; yang kedua membaca data sql dari instance lokal dan menyajikannya melalui json dan api yang tenang.

Saya awalnya berencana untuk mempertahankan data dengan postgresql, tetapi karena aplikasi akan memiliki volume data yang sangat rendah untuk disimpan dan lalu lintas untuk dilayani, saya pikir itu berlebihan. Apakah SQLite siap bekerja? Saya suka ide tapak kecil dan tidak perlu lagi memelihara sql server untuk tugas yang satu ini, tetapi saya khawatir dengan concurrency.

Tampaknya dengan mengaktifkan logging ke depan, membaca dan menulis database SQLite secara bersamaan dapat terjadi tanpa mengunci salah satu proses dari database.

Bisakah satu contoh SQLite mempertahankan dua proses bersamaan mengaksesnya, jika hanya satu yang membaca dan yang lainnya menulis? Saya mulai menulis kode tetapi bertanya-tanya apakah ini salah penerapan SQLite.

bb
sumber
3
@gnat Cool. Bisakah satu contoh SQLite mempertahankan dua proses bersamaan mengaksesnya, jika hanya satu yang membaca dan yang lainnya menulis? Saya mulai menulis kode tetapi bertanya-tanya apakah ini salah penerapan SQLite.
bb
Hanya kepala. Di perusahaan saya sebelumnya, kami menggunakan SQL (baik MS dan Oracle Express) untuk beberapa penyimpanan dan kami selalu merasa bahwa dengan sedikit yang kami simpan, kami tidak memerlukan DB lengkap. Jadi di salah satu rilis kami memutuskan untuk melakukan apa yang Anda lakukan. Ganti produk tersebut dengan SQLite. Kami memiliki hal yang persis sama, seorang penulis yang akan meletakkan data pada disk dan memperbarui TOC berbasis SQL dan proses pembaca (beberapa utas) yang akan membaca TOC untuk menentukan data mana yang akan diambil. Tidak tahu tentang SQLite akhir-akhir ini, tetapi betapa kecilnya konkurensi yang kami lakukan ternyata menjadi masalah besar dalam ...
DXM
... di belakang. Saya tidak ingat semua detail, tetapi saya pikir ketika satu proses mencoba untuk mendapatkan kunci dan tidak bisa karena yang lain sedang membaca, itu akan TIDUR untuk sesuatu yang gila seperti 20-30 detik. Kami akhirnya membuat utas khusus yang bertanggung jawab untuk akses SQLite dan kemudian kami memiliki kedua proses kami, dan semua utas di dalamnya, mengurutkan permintaan DB mereka ke satu utas tersebut. Kalau dipikir-pikir, saya mungkin tidak akan pergi dengan SQLite lagi.
DXM
1
@DXM terima kasih atas peringatannya, tetapi setelah menjalankan beberapa tes saya belum pernah menghadapi hal serupa. Saya tahu sqlite mendapatkan perombakan besar dengan versi 3, yaitu sekitar tahun 2004, jadi saya ingin tahu apakah pengalaman negatif Anda sudah ada sebelum waktu itu.
bb
1
... sendiri, daripada mengandalkan skema penguncian SQLite. Saya tidak melakukan pekerjaan sendiri, itu adalah tim lain tapi saya tetap di loop sebagian besar untuk memberikan umpan balik dan ingin tahu. Saya juga online dan melakukan beberapa bacaan independen dan menemukan halaman penulis asli. Dari membaca itu, saya mendapat kesan bahwa penemu SQLite hanya membenci utas dan tidak melihat mengapa ada orang yang menggunakannya, jadi a) DB tidak dirancang dengan mempertimbangkannya dan b) kunci / perlindungan agak ditambahkan / diretas sebagai renungan karena terlalu banyak orang memintanya.
DXM

Jawaban:

25

Anda mencari dokumentasi Penguncian File dan Konkurensi .

Proses SQLite menggunakan serangkaian kunci untuk menangani konkurensi; untuk membaca, beberapa proses dapat memperoleh SHAREDkunci.

Sebuah proses yang menulis, akan perlu untuk mendapatkan RESERVEDkunci, dan hanya ketika benar-benar harus menyiram perubahan ke disk yang pindah ke PENDINGnegara. Setiap proses membaca kemudian harus membuka kunci file, setelah itu proses penulisan dapat pindah ke EXCLUSIVEuntuk menulis ke file database yang sebenarnya.

Karena proses penulis hanya perlu mengunci file database untuk penulisan aktual (memory flushes, commit), sebuah pengaturan dengan hanya satu pembaca dan hanya satu penulis akan tampil cukup baik. Saya berharap itu berfungsi dengan baik, jika tidak lebih baik, sebagai pengaturan dengan hanya satu proses melakukan semua membaca dan menulis.

SQLite kurang cocok ketika Anda memiliki beberapa proses yang sering menulis ke database yang sama, karena menulis memerlukan memperoleh PENDINGkunci eksklusif untuk membuat serial perubahan.

Martijn Pieters
sumber
Terima kasih atas jawaban menyeluruhnya Martijn! Saya beberapa skrip untuk melakukan beberapa pengujian dan tampaknya dua proses akan dengan senang hati membaca dan menulis satu contoh sqlite secara bersamaan. Saya melakukan permintaan baca dan tulis bersamaan yang dilakukan setiap 1/100 detik dan masih belum menerima pengecualian db yang terkunci. Anehnya, satu-satunya saat saya mendapat pesan kesalahan "basis data terkunci" adalah ketika mencoba secara manual (dengan klien baris perintah sqlite3) untuk menghapus beberapa baris saat permintaan baca keluar dari skrip saya pada 1/100 detik. Saya ingin tahu apakah pysql secara otomatis mencoba kembali menulis setelah kesalahan seperti itu.
bb
10

Hanya ingin menindaklanjuti dan memberi tahu semua orang bahwa penerapannya berhasil. Bekerja dengan SQLite benar-benar menyenangkan, dan dengan hanya satu proses menulisnya pada satu waktu kami tidak pernah mengalami masalah dengan penguncian ... bahkan dengan pembacaan berbarengan yang sangat cepat dari proses sekunder.

bb
sumber