تالار گفتمان nCIS.ir

نسخه‌ی کامل: قفل کردن در InnoDB و برخورد ها
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام و خسته نباشید.

الان من یک جدول دارم که Process هایی رو در خودش نگه می داره و هر بار که کاربر یک فعالیت انجام میده Process هایی که زمان انجامشون فرا رسیده باید از جدول انتخاب بشوند و انجام بشوند و تغییراتی رو در جدول های دیگه به وجود بیارند.
این نکته رو هم بگم که این Process ها سراسری هستند؛ یعنی مربوط به کاربر خاصی نیستند.

خوب این که Process ها پردازش شدند یا نه رو با یک ستون در جدول مشخص کردم و وقتی که یک سری از Process ها انتخاب میشن بعدش با یک درخواست دیگه ستون completed اون هارو برابر با 1 قرار میدم. حالا ممکنه در بین این جریان انتخاب شدن و به روز رسانی ستون completed یک کاربر دیگه یک فعالیت انجام بده و دوباره Process هایی که انتخاب شدند ولی فرصت نشده بوده علامت گذاری شوند انتخاب بشن و اون Process ها دو بار انجام بشند که باعث خطا میشه توی برنامه.

حالا من دنبال Transaction ها و Lock ها در InnoDB رفتم ولی خوب چیزی پیدا نکردم که این مشکل رو حل بکنه.
SELECT...FOR UPDATE وجود داشت که خوب فقط جلوی سایر درخواست ها برای به روز رسانی رو می گیره نه انتخاب رو.


آیا باید از قفل کردن کل جدول استفاده بکنم؟!
هم میتونید اینکار رو انجام بدین هم اینکه یک روش جایگزین براش هست:

فیلد وضعیت رو با چند مقدار بروزرسانی کنید. مثلاً اگه 0 بود یعنی کاری انجام نشده. وقتی خواستین شروع به پردازش کنین، وضعیت رو 1 میکنین و وقتی کار تمام شد، 2

حالا اگه یه پردازشی 1 شد و بعد از مدت مشخصی به 2 نرسید، میتونید دوباره انجامش بدین.
درمورد قفل جدول هم این لینکها رو بررسی کنید:
https://dev.mysql.com/doc/refman/5.0/en/...ables.html
https://dev.mysql.com/doc/refman/5.0/en/...ggers.html

کلاً توی اینترنت درمورد Lock tables in MySQL جستجو کنید نتایج خوبی میاد.