یک تراکنش 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 کار می‌کند؛ نکته‌ها: تعداد سطرهای تأثیرپذیر را بررسی کنید، خطاها را در سمت کلاینت یا پروسیجر مدیریت کنید و برای جلوگیری از مشکلات همزمانی از قفل‌گذاری صریح استفاده کنید.

توسط پژوهشگر در 201 روز قبل ساعت 03:33
دسته بندی ها: SQL SQL for beginner
arash در 201 روز قبل ساعت 06:03

برای انتقال امن، از BEGIN/START TRANSACTION استفاده کنید و دو ردیف حساب‌های ۱ و ۲ را با SELECT ... FOR UPDATE قفل کنید تا رقابت هم‌زمان محدود شود. موجودی حساب ۱ را چک کنید که دست‌کم ۵۰۰ باشد و در غیر این صورت تراکنش را ROLLBACK کنید یا از محدودیت CHECK بهره ببرید تا بازرسی شود. سپس دو UPDATE را انجام دهید: کسر ۵۰۰ از حساب ۱ و اضافه کردن به حساب ۲؛ فقط اگر هر دو UPDATE تأیید شدند، COMMIT کنید و در غیر این صورت ROLLBACK و خطا را به کلاینت برگردانید. در محیط‌های با بار بالا، احتمال Deadlock وجود دارد، پس مدیریت خطا، retry و تنظیم سطح ایزولاسیون مناسب را در نظر بگیرید.

گزارش

1 پاسخ

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

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