اسید (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 فقط به اندازه قواعد تعریف‌شده در دیتابیس و برنامه معنی دارد. موتور دیتابیس به‌صورت خودکار از تمام قواعد کسب‌وکار اطلاع ندارد.

برای درک بهتر، ترنزکشن و رول‌بک را بخوانید.