مفهوم ACID چیست و بعنوان یک توسعه دهنده چگونه در باره‌ی آن فکر کنیم؟

اسید(ACID) در کامپیوتر مخفف 4 کلمه‌ی (Atomicity, Consistency, Isolation, Durability) میباشد که به ترتیب به معنای (تجزیه‌ناپذیری، سازگاری، انزوا، پایایی) میباشد و هرگاه با یک بانک اطلاعاتی رابطه‌ای سر و کار داریم به این خواص مختص تراکنش ها میباشد.شاید بعنوان کسی که تا به حال این مفهوم را در زمینه کامپیوتر نشنیده باشید، اسید(اسید-باز) در ذهن شما تداعی بشود:)

به طور کلی تراکنش چیست؟

قبل از اینکه بخواهیم به ACID بپردازیم میبایست بدانیم که مفهوم تراکنش چیست. (هرچند ACID اختصاصاً مربوط به تراکنش‌ها نیست)

کوچکترین واحد انجام کار را که وضعیت ثابت و مشخصی دارد را تراکنش مینامیم، هرتراکنش از سایرین مستقل است و با قطعیت انجام میشود یا به طور کلی انجام نمیشود و وضعیت نامشخص یا نصف و نیمه ندارد و یا نباید داشته باشد.

به طور مثال

انتقال کارت به کارت بانکی:

  • کسر مبلغ از حساب مبدا
  • افزایش موجودی حساب مقصد

سیستمی که وظیفه انجام این تراکنش را دارد میبایست به طور 100% تضمین کند که هرگاه اعتبار از حساب مبدا کسر شد همان مبلغ در حساب مقصد اضافه شود و اگر سیستم موفق به انجام هریک از این اعمال نشد میبایست حالت سیستم به قبل از تراکنش برگردد یعنی هیچ اعتباری از مبدا کسر نشود.


مفهوم ACID

در علم کامپیوتر، تراکنش‌ها باید خاصیت زیر را داشته باشند

  • Atomicity
  • Consistency
  • Isolation
  • Durability

با هم، این ویژگی ها راه دیگری برای بیان تعریف ما از تراکنش‌ها است:

  • هر تراکنش باید مطلق باشد(همه یا هیچ چیز) باشد.(A)
  • باید محدودیت‌های رخ داده شده در سیستم را دنبال کند و سیستم را از یک حالت پایدار به حالت پایدار دیگر ببرد (C)
  • باید مستقل باشد و برای سایر تراکنش‌ها قابل مشاهده باشد (I)
  • پس از تکمیل شدن به طور مسلم باید یک وضعیت جدید در سیستم ایجاد کند ، یعنی باید پس از انجام حالت سیستم طبق قوانین پایگاه داده تغییر کند(D)

به طور کلی خواص اسیدی برای انجام کارهای همزمان(concurrency) بسیار مناسب است.اگر عملیاتهایی که در سیستم انجام میشوند همزمان رخ میدهند با خواص اسیدی مطمئن میشوید که هیچ‌یک از تراکنشها در یکدیگر اختلال پیش نمی‌آورد و همچنین از بابت صحت عملیاتها خیالتان آسوده خواهد بود.

مثال عملی

چندسال پیش که کمتر با حوزه‌ی بانکهای اطلاعاتی آشنا بودم یک سیستم خرید و فروش راه اندازی کردم که تراکنشهای زیادی بر بستر وب‎سرویس اجرا میکرد در شروع کار به یک مشکل که برایم عجیب بود برخوردم و از آنجا بود که با تراکنش آشنا شدم.

مثال از این مشکل:

مشتری دارای 20 هزارتومان در کیف پول خود که در جدول Users ذخیره شده است.

با اجرای درخواست شماره1 در سطح اپلیکیشن

  • ابتدا مبلغ موجودی مشتری از جدول Users خوانده میشد
  • سپس مبلغ خرید فرضی 2000 تومان از موجودی او کسر میشد (در فضای اپلیکیشن) مبلغ باقیمانده 18000 تومان میباشد.
  • در این حین قبل از اتمام درخواست شماره1 یک درخواست دیگر(شماره2) با مبلغ 500 تومان به سمت اپلیکیشن می‌آمد و مبلغ حساب مشتری که هنوز همان 20هزارتومان است خوانده شده و از آن 500 تومان کسر میشود که خروجی معادل 19500 تومان میشود.
  • در این حین خرید شماره 1 ذخیره و موجودی مشتری به 18000 تومان تغییر پیدا میکند
  • سپس خریده شماره 2 هم ذخیره و مبلغ 19500 تومان در حساب مشتری درج میگردید


با این همزمانی به جای اینکه موجود مشتری حاصل 20هزار منهای 2000 و منهای 500 که معادل 17500تومان شود به مبلغ اشتباه 19500 تومان تبدیل میشد و همواره در کل سیستم اختلال ایجاد میکرد.


از این رو خواص اسیدی باعث میشود که چنین اتفاقی نیفتد و دو تراکنش در یکدیگر اختلال ایجاد نکنند.

در این مثال تراکنش روی جدول با انجین InnoDB در MySQL که از تراکنش پشتیبانی میکند باعث شد که هر ردیف قفل شود و فقط یک تراکنش در لحظه ذخیره شود و مجازاً تراکنشها در صف قرارگیرند.

مثال کدMySQL:

 START TRANSACTION; 
 SELECT @A:=wallet FROM users WHERE id=1; 
 UPDATE table2 SET [email protected] WHERE type=1;
 COMMIT; 

همچنین تراکنشها دارای roll back هستند و اگر سیستم دچار خطا شد تراکنش به حالت قبل بازگردانده میشوند.

از این لین میتوانید برای مطالعه‌ی بیشتر تراکنش‌ها در MySQL استفاده کنید.


دیتابیسهای غیر ACIDی

تمام دیتابیس‌ها از ACID پشتیبانی نمیکنند ولی هرکدام تضمین یکی از این خواص را ممکن است بدهند،یعنی ممکن است یک یا سه خاصیت را داشته باشند، برای مثال MongoDB فقط خاصیت تجزیه ناپذیری (A) داکیومنتها را پشتیبانی میکند. درکل نیازی نیست ما ACID را همه جا داشته باشیم بلکه بسته به نیاز پروژه میبایست تصمیم گیری کنیم.


با این حال برخی از پایگاه‌های داده از تراکنش پشتیبانی نمیکند و اگر از پایگاه داده ای استفاده میکنید ولی برنامه‌ی شما احتیاج به تراکنش دارد قطعاً به دردسر می‌افتید چون ایجاد خواص اسیدی در لایه‌های بالاتر به شدت دردسر ایجاد خواهد کرد و بهترین انتخاب جایگزینی یک دیتابیس تراکنش پذیر میباشد.


بعلت مشغله و گرفتاری‌های شخصی این مقاله رو بیشتر گسترش ندادم ، امیدوارم تا این حد در خور توجهتون باشه ،مثل همیشه خواستار اینم ایرادات نوشتاری و فنی ... رو تذکر بدهید ;)