Devobin
عکس
برای نمایش کلیک کنید
برای نمایش کلیک کنید
#Devocook
⚛️ 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
5 · 627 ·