یک تراکنش SQL بنویسید که مبلغ 500 را از حساب با id = 1 به حساب با id = 2 منتقل کند و فقط در صورت موفقیت همهٔ عملیات، تغییرات را با COMMIT نهایی کند.
2.0 بازدید آخرین ویرایش در 201 روز قبل ساعت 03:33 0.0
برای حل: از تراکنشها (BEGIN/START TRANSACTION) استفاده کنید، ابتدا ردیفهای مربوط به دو حساب را با SELECT ... FOR UPDATE قفل کنید، سپس دو UPDATE برای کسر و افزودن مبلغ انجام دهید، شرط بررسی کنید که موجودی منفی نشود و در صورت موفقیت از COMMIT و در غیر این صورت از ROLLBACK استفاده کنید. این راهکار در پایگاهدادههایی مانند MySQL و PostgreSQL کار میکند؛ نکتهها: تعداد سطرهای تأثیرپذیر را بررسی کنید، خطاها را در سمت کلاینت یا پروسیجر مدیریت کنید و برای جلوگیری از مشکلات همزمانی از قفلگذاری صریح استفاده کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای انتقال امن، از BEGIN/START TRANSACTION استفاده کنید و دو ردیف حسابهای ۱ و ۲ را با SELECT ... FOR UPDATE قفل کنید تا رقابت همزمان محدود شود. موجودی حساب ۱ را چک کنید که دستکم ۵۰۰ باشد و در غیر این صورت تراکنش را ROLLBACK کنید یا از محدودیت CHECK بهره ببرید تا بازرسی شود. سپس دو UPDATE را انجام دهید: کسر ۵۰۰ از حساب ۱ و اضافه کردن به حساب ۲؛ فقط اگر هر دو UPDATE تأیید شدند، COMMIT کنید و در غیر این صورت ROLLBACK و خطا را به کلاینت برگردانید. در محیطهای با بار بالا، احتمال Deadlock وجود دارد، پس مدیریت خطا، retry و تنظیم سطح ایزولاسیون مناسب را در نظر بگیرید.
گزارش