با استفاده از تابع GET_LOCK در MySQL یک قفل به نام 'orders_lock' با زمان انتظار 10 ثانیه بگیرید، در صورت موفقیت رکورد با id=123 در جدول orders را به وضعیت 'processing' بروزرسانی کنید و سپس قفل را با RELEASE_LOCK آزاد کنید.

4.0 بازدید آخرین ویرایش در 201 روز قبل ساعت 03:28

0.0

برای حل این مسئله از توابع سیستمی MySQL استفاده کنید: ابتدا با SELECT GET_LOCK('orders_lock', 10) تلاش به گرفتن قفل کنید و مقدار بازگشتی را بررسی کنید (1=موفق، 0=timeout، NULL=خطا). اگر مقدار 1 بود، دستور UPDATE orders SET status='processing' WHERE id=123 را اجرا کنید و در انتها با SELECT RELEASE_LOCK('orders_lock') قفل را آزاد نمایید. توجه داشته باشید که GET_LOCK قفل سطح اتصال است، بنابراین تمام عملیات باید در یک اتصال (session) اجرا شوند و از مقداردهی timeout مناسب استفاده کنید.

توسط پژوهشگر در 201 روز قبل ساعت 03:28
دسته بندی ها: MySQL MySQL for beginner
arman در 201 روز قبل ساعت 06:19

GET_LOCK در سطح اتصال کار می‌کند، بنابراین همهٔ گام‌ها باید در یک نشست اجرا شوند. اگر مقدار بازگشتی 1 بود، UPDATE در همان نشست انجام می‌شود و در نهایت RELEASE_LOCK فراخوانی می‌شود تا قفل آزاد شود. اگر 0 یا NULL بازگردد، UPDATE انجام نمی‌شود و باید برخورد با timeout یا خطا را مدیریت کنید. برای جلوگیری از نشت قفل، بهتر است RELEASE_LOCK همواره در بلاک نهایی یا معادل آن اجرا شود تا جلوی قفل ماندن ناخواسته گرفته شود.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری