Bagaimana cara mencegah kunci basis data SQLite?

10

Dari FAQ SQLite, saya tahu bahwa:

Beberapa proses dapat membuat database yang sama terbuka pada saat yang bersamaan. Beberapa proses dapat dilakukan SELECTsekaligus. Tetapi hanya satu proses yang dapat membuat perubahan pada basis data kapan saja, bagaimanapun.

Jadi, sejauh yang saya mengerti bahwa saya dapat: 1) Baca db dari beberapa benang ( SELECT) 2) Baca db dari beberapa benang ( SELECT) dan write dari benang tunggal ( CREATE, INSERT, DELETE)

Tapi, saya membaca tentang Write-Ahead Logging yang menyediakan lebih banyak konkurensi karena pembaca tidak memblokir penulis dan penulis tidak memblokir pembaca . Membaca dan menulis dapat dilanjutkan secara bersamaan.

Akhirnya, saya harus benar-benar kacau ketika saya menemukan itu , ketika ditentukan:

Berikut adalah alasan lain untuk mendapatkan kesalahan SQLITE_LOCKED:

  • Mencoba CREATEatau DROPtabel atau indeks saat SELECTpernyataan masih tertunda.
  • Mencoba menulis ke tabel saat a SELECTsedang aktif di meja yang sama.
  • Mencoba melakukan dua SELECThal pada tabel yang sama secara bersamaan dalam aplikasi multithread, jika sqlite tidak diatur untuk melakukannya.
  • fcntl (3, F_SETLK panggilan pada file DB gagal. Ini bisa disebabkan oleh masalah penguncian NFS, misalnya. Salah satu solusi untuk masalah ini, adalah dengan memindahkan DB, dan menyalinnya kembali sehingga memiliki nilai inode baru

Jadi, saya ingin mengklarifikasi untuk diri saya sendiri, perlu untuk menghindari kunci? Dapatkah saya membaca dan menulis pada saat yang sama dari dua utas yang berbeda? Terima kasih.

Andrei Orlov
sumber

Jawaban:

8

Halaman yang Anda tautkan, selain cukup lama, berbicara tentang akses dari proses yang sama melalui koneksi database yang sama (atau melalui koneksi multipe dalam mode cache bersama , yang tidak boleh Anda gunakan).

Ketika tidak dalam mode WAL, beberapa koneksi dapat membaca dari database yang sama, tetapi transaksi penulisan bersifat eksklusif, yaitu, tidak ada pembaca atau penulis lain yang diizinkan.

Dalam mode WAL, penulis dan pembaca tidak memblokir satu sama lain, tetapi hanya ada satu penulis yang diizinkan.

CL.
sumber
1
Apa yang salah dengan mode cache bersama? Saya bisa mendapatkan beberapa thread python dalam proses yang sama untuk menulis ke sebuah tabel dengannya melalui joblb Parallel for loop . Saya memiliki masalah penguncian sampai satu set isolation_level=Nonesekalipun. Tanpa mode cache yang dibagikan, bagaimana cara saya berbagi instance antar thread
Justin Dearing
1
Dokumentasi menjelaskan kerugian. Ini sangat berbahaya jika Anda tidak tahu cara menghindari kebuntuan.
CL.
Datang sangat terlambat ke pesta, tetapi tautan ini bermanfaat. manski.net/2012/10/sqlite-performance
infocyde