🧠 یک Race Condition پنهان در JavaScript
کد زیر را در نظر بگیر:
let balance = 100;
async function withdraw(amount) {
if (balance >= amount) {
await saveTransaction(amount);
balance -= amount;
}
}
حالا فرض کن دو درخواست برداشت ۸۰ واحدی تقریباً همزمان اجرا شوند.
هر دو ممکن است قبل از پایان
await، موجودی ۱۰۰ را بخوانند و شرط را با موفقیت پشت سر بگذارند.نتیجه؟ هر دو تراکنش میتوانند ثبت شوند، درحالیکه موجودی کافی برای هر دو وجود ندارد.
این یک نمونه از Race Condition است.
🔍 نکته مهم این است که JavaScript تکریسمانی بودنش را تضمینکننده امنیت عملیات ناهمزمان نمیکند.
راهکارهای واقعی:
🔹 کنترل اتمیک موجودی در دیتابیس
🔹 استفاده از Transaction
🔹 قفلگذاری مناسب یا Optimistic Concurrency
🔹 اعمال محدودیت در سطح دیتابیس
برای نمونه، کاهش موجودی باید بهصورت شرطی و اتمیک انجام شود؛ نه با خواندن و سپس نوشتن جداگانه.
قاعده: عملیات مالی را هرگز صرفاً به کنترلهای سمت JavaScript نسپارید.
@CodeVerse_dev