Dari FAQ SQLite, saya tahu bahwa:
Beberapa proses dapat membuat database yang sama terbuka pada saat yang bersamaan. Beberapa proses dapat dilakukan
SELECT
sekaligus. 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
CREATE
atauDROP
tabel atau indeks saatSELECT
pernyataan masih tertunda.- Mencoba menulis ke tabel saat a
SELECT
sedang aktif di meja yang sama.- Mencoba melakukan dua
SELECT
hal 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.
isolation_level=None
sekalipun. Tanpa mode cache yang dibagikan, bagaimana cara saya berbagi instance antar thread