0 Soalan: Mengunci pangkalan data SQLite3 keseluruhan semasa kemas kini

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya perlu mengemas kini pangkalan data SQLite3, yang akan menjatuhkan jadual, mencipta semula, dan kemudian mengisi semula jadual. Saya ingin memastikan semua proses lain yang mengakses pangkalan data harus menunggu transaksi selesai untuk mengelakkan dari jadual potensi kosong /hilang.

Pada ketika ini kod saya adalah seperti ini:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Walaupun ini berfungsi, saya tidak pasti saya benar-benar mengunci DB. Saya telah menemui beberapa maklumat bertentangan dalam talian yang menyebutkan 'BEGIN TRANSAKSI EKSKLUSIF' vs 'BEGIN TRANSACTION'.

Bolehkah seseorang menjelaskan jenis urus niaga yang saya perlukan untuk memastikan tiada bacaan lain berjaya semasa saya menguncinya?

    
- 1
  1. Persoalannya terlalu luas kerana jawapannya bergantung hampir sepenuhnya pada keadaan tertentu anda. Adakah anda menyambung dalam mod WAL? Adakah LOCKING_MODE lalai atau eksklusif? Adakah SHARED_CACHE_MODE didayakan? Adakah tahap pengasingan sambungan lain "dibaca tanpa komitmen" atau tidak? Terlalu banyak butiran.
    2019-05-08 17: 11: 09Z
  2. Saya sebenarnya tidak tahu apa-apa tentang proses lain (bagaimana ia ditulis). Saya cuba untuk mengemas kini pangkalan data dari baris arahan bash, menggunakan .sql yang saya buat. Saya ingin memastikan proses lain tidak mengeluh tentang jadual hilang /kosong. Jadi saya mahukan MY .sql file untuk mengunci pangkalan data dengan tepat
    2019-05-08 18: 08: 27Z
  3. Dengan tetapan biasa, kunci tulis akan diperoleh untuk jadual drop dan tidak dikeluarkan sehingga komit. Tiada sambungan lain boleh memperoleh kunci sehingga masa itu. Tetapi jika anda mempunyai beberapa sambungan yang bertanding untuk kunci tulis secara tetap, anda harus menggunakan pangkalan data yang berbeza. Banyak pembaca dan kadang-kadang penulis, mungkin mode Wal.
    2019-05-08 18: 54: 32Z
  4. @shawn - pembaruan ini tidak kerap jadi itu ok. Saya tidak mempunyai kawalan ke atas pemasangan SQLite (jadi saya tidak boleh mengubah tetapan seperti mode WAL.) Jadi saya berharap ada jawapan yang mudah seperti menggunakan "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
0 Jawapan                              0                         
sumber diletakkan di sini