اسید (ACID) سرواژه چهار ویژگی Atomicity، Consistency، Isolation و Durability است. این چهار اصل کمک میکنند ترنزکشنهای دیتابیس حتی در حضور خطا، همروندی یا قطع برنامه رفتار مشخص و قابلاعتمادتری داشته باشند. فرض کنید خریدار آخرین موجودی یک محصول را ثبت میکند و همزمان پرداخت انجام میشود. بدون تعریف دقیق مرز ترنزکشن و قواعد یکپارچگی ممکن است سفارش ثبت شود ولی موجودی یا پرداخت در وضعیت نادرست بماند.
چهار ویژگی ACID با مثالهای مستقل
| اصل | معنی | مثال در فروشگاه |
|---|---|---|
| Atomicity، اتمی بودن | همه تغییرات یک ترنزکشن یا هیچکدام | در ثبت فاکتور، ایجاد Order و OrderItem با هم Commit شوند |
| Consistency، سازگاری | قواعد و Constraintهای تعریفشده حفظ شوند | شماره سفارش یکتا و موجودی با قید معتبر بماند |
| Isolation، جداسازی | تداخل ترنزکشنها مطابق سطح Isolation کنترل شود | دو خریدار نتوانند بدون کنترل همزمانی یک صندلی را دوبار رزرو کنند |
| Durability، ماندگاری | پس از Commit موفق تغییرات در برابر خرابیهای پوششدادهشده پایدار باشند | سفارش تاییدشده با راهاندازی مجدد برنامه حذف نشود |
نمونه SQL با بررسی موجودی
START TRANSACTION;
UPDATE products
SET stock = stock - 1
WHERE id = 42 AND stock > 0;
-- Check affected rows: exactly 1 is required.
INSERT INTO orders (user_id, status) VALUES (7, 'pending');
COMMIT;
نمونه بالا برای توضیح است. در نسخه عملی باید نتیجه UPDATE بررسی شود و اگر ردیفی تغییر نکرد، ترنزکشن Rollback شود. ایجاد سفارش، ثبت پرداخت و فراخوانی API بیرونی مرز یکسانی ندارند. اثر سرویس خارجی را نمیتوان با Rollback دیتابیس بهسادگی لغو کرد.
نمونه Laravel
DB::transaction(function () use ($productId, $userId) {
$affected = DB::table('products')
->where('id', $productId)->where('stock', '>', 0)
->decrement('stock');
if ($affected !== 1) {
throw new RuntimeException('Out of stock');
}
DB::table('orders')->insert([
'user_id' => $userId, 'status' => 'pending',
]);
});
اسید با CAP فرق دارد
اصول اسید ویژگیهای تراکنش را شرح میدهند، اما قضیه CAP درباره محدودیتهای دسترسپذیری و سازگاری هنگام قطع شبکه در سامانههای توزیعشده صحبت میکند. سطوح جداسازی تراکنش هم مدلهای مختلف کنترل همزمانی تراکنشها را توضیح میدهد.
خطای رایج
Consistency در ACID فقط به اندازه قواعد تعریفشده در دیتابیس و برنامه معنی دارد. موتور دیتابیس بهصورت خودکار از تمام قواعد کسبوکار اطلاع ندارد.
برای درک بهتر، ترنزکشن و رولبک را بخوانید.