0 سؤال: قفل قاعدة بيانات SQLite3 بأكملها أثناء التحديث

السؤال الذي تم إنشاؤه في Wed, May 8, 2019 12:00 AM

يجب أن أقوم بتحديث قاعدة بيانات SQLite3 ، والتي ستسقط جدولًا ، وأنشئها ، ثم أعد ملء الجدول. أريد التأكد من أن جميع عملياتي الأخرى التي تصل إلى قاعدة البيانات يجب أن تنتظر حتى تكتمل المعاملة لتجنب الاستعداد من جدول فارغ /مفقود محتمل.

في هذه المرحلة ، يشبه الكود الخاص بي:

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

بينما يعمل هذا ، لست متأكدًا من أنني أقفل حقًا قاعدة البيانات. لقد وجدت بعض المعلومات المتناقضة على الإنترنت التي تذكر "BEGIN TRANSACTION EXCLUSIVE" مقابل "BEGIN TRANSACTION".

هل يمكن لأي شخص أن يشرح نوع المعاملة الذي أحتاجه لضمان عدم نجاح القراءات الأخرى أثناء إقفالها؟

    
- 1
  1. السؤال واسع جدًا لأن الإجابة تعتمد بالكامل تقريبًا على ظروفك المحددة. هل تتصل في وضع WAL؟ هل LOCKING_MODE افتراضي أم حصري؟ هل SHARED_CACHE_MODE ممكن؟ هل مستوى عزل الاتصالات الأخرى "غير ملتزم به" أم لا؟ الكثير من التفاصيل.
    2019-05-08 17: 11: 09Z
    لى>
  2. أنا في الواقع لا أعرف أي شيء عن العمليات الأخرى (كيفية كتابتها). أحاول تحديث قاعدة البيانات من سطر أوامر bash ، باستخدام ملف .sql الذي قمت بإنشائه. أريد التأكد من أن العمليات الأخرى لا تشكو من جدول مفقود /فارغ. لذلك أريد ملف MY .sql لقفل قاعدة البيانات بشكل مناسب
    2019-05-08 18: 08: 27Z
    لى>
  3. من خلال الإعدادات العادية ، سيتم الحصول على قفل للكتابة لجدول الإفلات ولن يتم إصداره حتى الالتزام. لا يمكن لأي اتصال آخر الحصول على قفل حتى ذلك الحين. ولكن إذا كان لديك اتصالات متعددة تتنافس على تأمين الكتابة بشكل منتظم ، فيجب أن تستخدم قاعدة بيانات مختلفة. الكثير من القراء والكتاب من حين لآخر ، ربما وضع "وول".
    2019-05-08 18: 54: 32Z
    لى>
  4. @ Shawn - هذا التحديث غير متكرر ، لذلك لا بأس بذلك. لا أملك التحكم في تثبيت SQLite (لذلك لا يمكنني تعديل الإعدادات مثل وضع WAL.) لذلك كنت آمل أن يكون هناك إجابة بسيطة مثل استخدام "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
    لى>
0 إجابة                              0                         
وضع مصدر هنا