سؤال

أحاول تنفيذ الالتزام على مرحلتين باستخدام PHP وMySQL، وأقوم بذلك باختصار.

العقبة الرئيسية التي وجدتها هي أنني غير قادر على تخزين مورد اتصال MySQL في مكان يمكنني العثور عليه مرة أخرى للمرحلة الثانية.هل من الممكن إجراء تسلسل لمقبض قاعدة البيانات؟

هذه هي الحالة التي أحاول الترميز لها:

  1. يرسل المستخدم البيانات
  2. يبدأ الخادم معاملة MySQL وينفذ بعض الاستعلامات بناءً على البيانات التي تلقاها.
  3. يرسل الخادم ملفًا مرة أخرى إلى المستخدم
  4. عندما يتلقى المستخدم الملف بنجاح، ينفذ الخادم معاملته.وإلا فإنه يعيدها.

يبدو أن هذا يتطلب دورتين لطلب/استجابة HTTP، لذا أحتاج إلى إعادة الاتصال بنفس مقبض قاعدة البيانات في الطلب الثاني من أجل تنفيذ المعاملة.لقد فشلت في هذا الجزء.

نرحب بأي نصيحة، حتى لو كانت "هذا غير ممكن في PHP"

هل كانت مفيدة؟

المحلول

ألقِ نظرة على Lixa Transaction Manager (http://lixa.sourceforge.net/) يدمج PHP و MySQL بدءًا من الإصدار 0.9.0

ويوفر معالجة المعاملات الموزعة وميزة التزام مرحلة أيضًا.

يعتبر

الفصل. F.

نصائح أخرى

نظرًا لأن PHP هو طلب / استجابة يستند إلى تنفيذ اتصال DB المستمر ، فهو غير محتمل ، AFAIK.

يمكنك محاولة العمل حول هذا القيد باستخدام نوع من آلية التذاكر. ستكون خطواتك:

  1. يرسل المستخدم البيانات
  2. يبدأ Server معاملة MySQL وينفذ بعض الاستعلامات بناءً على البيانات التي تلقاها ، وتعيين تذكرة "فريدة" لتلك المعاملة.
  3. يرسل الخادم ملفًا وعودة التذكرة إلى المستخدم
  4. عندما يستقبل المستخدم الملف بنجاح وأرسل طلبًا آخر يحتوي على تلك التذكرة ، يرتكب الخادم معاملته. وإلا فإنه يلفها مرة أخرى.
  5. في إشارة إلى تعليق Cassy: بعد فترة زمنية معينة ، يجب أن يتم التراجع عن جميع TAs من أجل منع DB من "Beeing Flood" بالمعاملات القديمة

HTH

للإجابة على KB22 وrojoca، السبب الذي يجعلني بحاجة إلى القيام بذلك بهذه الطريقة هو أن "الملف" الذي أشير إليه هو في الواقع قاعدة بيانات sqlite التي تنتهي كمخزن بيانات على جهاز محمول.

يقوم الطلب الأول بنشر قاعدة بيانات sqlite المحدثة على الخادم، الذي يحاول دمج البيانات من جداول sqlite؛تنشأ المشاكل عندما لا يتلقى الجهاز المحمول بنجاح قاعدة بيانات sqlite جديدة (واحدة تعكس تغييرات الجهاز المحمول وأي أشياء جديدة أخرى من تطبيق الويب)، لأنه سيحاول بعد ذلك إرسال نفس قاعدة بيانات sqlite (القديمة) إلى web مرة ثانية، مما يؤدي إلى إدخالات مكررة في جداول الويب لأي شيء تم إنشاؤه على الجهاز المحمول.

لذلك، يحتاج الويب إلى التأكد من أن الجهاز لديه قاعدة البيانات الجديدة قبل تنفيذ تغييرات الدمج.نظرًا لتقلبات الشبكات، يبدو هذا ممكنًا فقط إذا كان الجهاز قادرًا على إرسال ACK صريح بعد تلقي قاعدة بيانات sqlite الجديدة.وهذا لا يكون ممكنا إلا إذا قدمنا ​​طلبين (1.قاعدة بيانات sqlite المراد دمجها؛2.ACK باستلام قاعدة بيانات sqlite الجديدة على الجهاز).

إنها مشكلة شائكة بالفعل، ومن المفيد معرفة أن PHP لا يمكنها التعامل مع مقابض قاعدة البيانات وصولاً إلى المستوى الضروري.

[لا أعتقد أيضًا أنه يمكنني استخدام جدول المعاملات لأنني بحاجة إلى إرجاع البيانات إلى الجهاز بناءً على جداول قاعدة بيانات الويب "الحقيقية".أعتقد أنني سأواجه مشكلات تتعلق بحقول الزيادة التلقائية إذا لم أستخدم الجداول الحقيقية]

شكرا على كافة تعليقاتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top