SQLite - كيف يمكنني التعامل مع الخلاف المحتمل بين موضوعين منفصلين يصلون إلى نفس قاعدة البيانات؟
-
21-09-2019 - |
سؤال
سؤال: كيف يمكنني التعامل مع الخلاف المحتمل بين موضوعين منفصلين يصلون إلى نفس قاعدة بيانات SQLite؟
الخلفية: لدي تطبيق C# winforms يستخدم SQLite عبر ado.net. لديّ خيط خلفية عامل في تطبيق WinForms. لقد لاحظت أنه يمكنني الحصول على استثناء عندما يحاول كل من الخيط الرئيسي ، وخيط عامل الخلفية ، تحديث قاعدة بيانات SQLite ، أي استدعاء dbdataadaptor.update () ..
لذلك أنا مهتم بما يتحقق من الكود الخاص بي (وإن كان رمز الخيط الرئيسي و/أو الكود الذي يتم تشغيله في عامل الخلفية) للتعامل مع هذا بأمان ، إما عن طريق طريقة للتحقق مسبقًا ، أو الحظر حتى موافق ، أو رفع خطأ محدد يمكنني التقاطه ...
شكرًا
المحلول
في SQLite ، يمكنك تكوين رد اتصال يتم تشغيله عند مواجهة أ SQLITE_BUSY
أو SQLITE_IOERR_BLOCKED
خطأ (انظر http://www.sqlite.org/c3ref/busy_handler.html).
نظرًا لأن ما تريد القيام به في معظم الأوقات هو النوم وإعادة محاولة الاستعلام على مشغول ، فإن SQLite لديه رد اتصال مدمج يفعل ذلك بالضبط ؛ تقرأ على sqlite3_busy_timeout
في http://www.sqlite.org/c3ref/busy_timeout.html.