C# içindeki SQLite veritabanına erişmek için System.Data.Sqlite kullanıyorum. Tablodaki satırları okuması gereken bir sorgum var. Satırlar arasında geçiş yaparken ve okuyucu açıkken, bazı SQL güncellemeleri gerçekleştirilmelidir. Bir "veritabanı kilitli" istisna koşuyorum.SQLite sorgusunu veritabanını kilitlemeden bir veri okuyucu ile nasıl gerçekleştirirsiniz?
SQLite documentation devletler:
bir süreç, bir veritabanı dosyasından okumak istediği
, bu adımları sırayla takip:
- Açık veritabanı dosyası ve PAYLAŞILAN kilit almak. kilitleme "ORTAK" hakkında
belgelerine başka devletler:
veritabanı okumak ama yazılmamış olabilir. Herhangi bir sayıda işlem aynı anda SHARED kilitleri tutabilir, dolayısıyla birçok eşzamanlı okuyucu olabilir. Ancak bir veya daha fazla SHARED kilit aktifken başka bir iş parçacığı veya işlem veritabanı dosyasına yazılmasına izin verilmez.
FAQ devletler:
Çoklu işlemler aynı anda açık aynı veritabanını sahip olabilir. Birden çok süreç aynı anda SELECT yapabilir. Ancak, yalnızca bir süreç veritabanında zaman içinde herhangi bir anda değişiklik yapabilir.
kitap The Definitive Guide to SQLite devletler:
... bir bağlantı pragma read_uncommited kullanarak bir salt kararsız yalıtım düzeyine sahip tercih edebilirsiniz. true olarak ayarlanmışsa, bağlantı okunan tablolara okuma kilitleri koymaz. Bu nedenle, başka bir yazar, okuma-alınmamış moddaki bağlantı başka bir bağlantı tarafından engellenemez ya da engellenemeyeceğinden bir tabloyu değiştirebilir.
PRAGMA read_uncommitted = 1; SELECT Column1, Column2 FROM MyTable
hala bir "veritabanı ile başarısız farklı bir bağlantı kullanarak aynı iş parçacığı üzerinde bir SQL güncelleştirme kilitlendi:
ben şöyle SQL sorgu komut ifadesi içindeki kararsız okumak için pragma belirlemeye çalıştı "istisna. Daha sonra bağlantı örneğinde okunamayan okuma düzeyini yalıtmaya çalıştım. Hala aynı istisna dışında değişiklik yok.
Veritabanını kilitlemeden veritabanında satırlar arasında geçiş yapmak için açık bir veri okuyucusuna sahip olmayı nasıl başarabilirim, böylece güncelleştirmeleri çalıştırabilir miyim?
Güncelleme:
işin altına Hem cevapları. Ancak, o zamandan beri, varsayılan geri alma günlüğünü kullanarak, veritabanı okumalarının ve yazmalarının geliştirilmiş eşzamanlılığını sağlayan Write-Ahead Günlüğü'nü kullanmaya başladım.
. Http://sqlite.phxsoftware.com/ göre System.Data.SQLite.dll sürümü 1.0.66.0 18 Nisan 2010 ve SQLite sürümü 3.6.23.1 olduğunu. WAL kullanmak için 3.7+ sürümüne ihtiyacım var gibi görünüyor. Baska öneri? Güncelleştirilmiş bir ADO.Net sağlayıcısı var mı? – Elan
Evet, bkz. Http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki sürüm 1.0.68.0 Şubat 2011, SQLite 3.7.5 –
ile bir kod birleştirme olduğunu umut verici görünüyor; maalesef henüz indirilmeye hazır veya hazır bir şey görmedim ... Bu sürüm 1.0.68.0 resmi olarak kullanılabilir mi, yoksa bu bir alfa/beta mı? – Elan