0 Soru: Güncelleme sırasında tüm SQLite3 veritabanını kilitleme

tarafından oluşturulan soru Wed, May 8, 2019 12:00 AM

Bir tablo bırakacak, yeniden yaratacak ve daha sonra tabloyu yeniden oluşturacak olan bir SQLite3 veritabanını güncellemem gerekiyor. Veritabanına erişen tüm diğer işlemlerimin potansiyel boş /eksik bir tablodan hazır olmamak için işlemin tamamlanmasını beklemek zorunda kalmasını istiyorum.

Bu noktada kodum şöyle:

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

Bu işe yararken, DB'yi gerçekten kilitlediğimden emin değilim. 'BEGIN TRANSACTION' ile 'BEGIN TRANSACTION EXCLUSIVE' ile ilgili bazı çelişkili bilgiler buldum.

Birisi kilitlenmiş durumdayken başka hiçbir okunuşun başarılı olmamasını sağlamak için gereken işlem türünü açıklayabilir mi?

    
- 1
  1. Soru çok geniş çünkü cevap neredeyse tamamen sizin kendi şartlarınıza bağlı. WAL modunda bağlanıyor musunuz? LOCKING_MODE varsayılan mı yoksa özel mi? SHARED_CACHE_MODE etkin mi? Diğer bağlantıların izolasyon seviyesi "okunmamış" mı yoksa okunmuyor mu? Çok fazla ayrıntı var.
    2019-05-08 17: 11: 09Z
  2. Aslında diğer işlemler hakkında hiçbir şey bilmiyorum (nasıl yazıldıkları). Veritabanını, oluşturduğum bir .sql kullanarak bash komut satırından güncellemeye çalışıyorum. Diğer işlemlerin eksik /boş bir tablodan şikayet etmemesini sağlamak istiyorum. Bu yüzden MY .sql dosyasının veritabanını uygun şekilde kilitlemesini istiyorum
    2019-05-08 18: 08: 27Z
  3. Normal ayarlarla, açılan tablo için bir yazma kilidi alınacak ve işleme kadar serbest bırakılmayacak. O zamana kadar başka hiçbir bağlantı kilitlenemez. Ancak düzenli olarak yazma kilitleri için yarışan birden fazla bağlantınız varsa, farklı bir veritabanı kullanıyor olmalısınız. Çok sayıda okuyucu ve bazen de yazar, belki Wal modu.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - bu güncelleme sık değil, bu yüzden tamam. SQLite kurulumu üzerinde denetimim yok (WAL modu gibi ayarları değiştiremiyorum.) Bu yüzden "BEGIN TRANSACTION XXX" kullanımı gibi basit bir cevap olduğunu umuyordum.
    2019-05-09 00: 12: 19Z
    0 Yanıtlar                              0                         
kaynak yerleştirildi İşte