#Devocook
⚛️ Atomic Operations در جنگو: وقتی `save()` نجات نمیدهد
🧠 قسمت 1: مشکل کجاست؟
با
نتیجه:
⚛️ قسمت 2: راه حل اتمیک
استفاده از
این کار اتمیک و بدون تداخل است.
🧩 قسمت 3: مثالها
⚠️ قسمت 4: تله مهم – ترکیب با `save()`
✅ راه درست:
❤️ @devobin
⚛️ Atomic Operations در جنگو: وقتی `save()` نجات نمیدهد
🧠 قسمت 1: مشکل کجاست؟
با
view_count = 10 و دو کاربر همزمان:product = Product.objects.get(id=1)
product.view_count += 1
product.save()
نتیجه:
11 (باید 12 باشد). Race Condition در محیط همزمان حتمی است.⚛️ قسمت 2: راه حل اتمیک
استفاده از
F expressions:from django.db.models import F
Product.objects.filter(id=1).update(view_count=F('view_count') + 1)
این کار اتمیک و بدون تداخل است.
🧩 قسمت 3: مثالها
# افزایش موجودی
Product.objects.filter(id=1).update(stock=F('stock') + 5)
# انتقال موجودی
Order.objects.filter(id=1).update(total_price=F('sub_total') + F('tax'))
# شرط مقایسه
Product.objects.filter(stock__gt=F('min_threshold'))
⚠️ قسمت 4: تله مهم – ترکیب با `save()`
# ❌ اشتباه
product.view_count = F('view_count') + 1
product.save() # F آبجکت ذخیره میشود، نه مقدار
✅ راه درست:
product.view_count = F('view_count') + 1
product.save(update_fields=['view_count'])
product.refresh_from_db()❤️ @devobin
❤2👍1