ریس کاندیشن (Race Condition) یا شرایط رقابتی وقتی رخ میدهد که نتیجه یک عملیات به زمانبندی اجرای چند کار همروند وابسته باشد. دو درخواست همزمان برای خرید آخرین کالای انبار ممکن است موجودی را جداگانه بخوانند و هر دو تصور کنند کالا موجود است.
نمونه ساده ریس کاندیشن در Python
from threading import Thread, Lock
stock = 1
lock = Lock()
def reserve():
global stock
with lock:
if stock > 0:
stock -= 1
threads = [Thread(target=reserve) for _ in range(2)]
for t in threads: t.start()
for t in threads: t.join()
نمونه PHP با آپدیت اتمیک دیتابیس
$affected = DB::table('products')->where('id', $id)
->where('stock', '>', 0)->decrement('stock');
if ($affected === 0) { throw new RuntimeException('Out of stock'); }
نمونه Go با Atomic
var stock atomic.Int64
stock.Store(1)
for {
old := stock.Load()
if old == 0 || stock.CompareAndSwap(old, old-1) { break }
}
عملیات اتمیک (Atomic Operation) یکی از راههای جلوگیری از برخی ریس کاندیشنهاست، اما «اتمیک لاک» اصطلاح نامگذاریشده استانداردی برای نوعی از ریس کاندیشن نیست. Atomic، Mutex و Lock ابزارهای هماهنگسازی هستند، نه زیرگونههای خود مشکل.
برای کنترل داده مشترک از آپتیمیستیک لاکینگ، پسیمیستیک لاکینگ و عملیات اتمیک استفاده میشود. مقاله مقایسه دو روش Locking در باورژن مثالهای عملی بیشتری دارد.