همیشه هم برای من این سوال بوده که واقعا این بحث تراکنش به صورت اتمیک در پایگاه داده چه جوری پیاده سازی شده که ؟؟
با استفاده از LogFile. همانطور که میداید با استفاده از Transaction ها می توان چند دستور را اجرا کرد به طوی که اگر یکی از آنها به هر دلیلی انجام نشد از تمامی دستورات آن تراکنش هم صرف نظر می شود. در حالت کلی (به نظر من) RDBMS ها از روشی شبیه به مراحل زیر استفاده می کنند:
1- تراکنش T را که شامل دستورات t1, t2, t3, ... هست را در نظر بگیرید که برای اجرا به RDBMS مربوطه فرستاده شده است.
2- ابتدا می آییم و تراکنش را به همراه دستوراتش را در حافظه جانبی(در یک فایل، یک جدول و یا هر جای دیگری) به شکل مفهومی زیر ذخیره می کنیم:
[T]
t1 = Insert Into ....
t2 = Update ...
t3 = Delete ....
t4 = ....
3- حال دستورات تراکنش را دانه به دانه اجرا می کنیم. فقط به این نکته توجه داشته باشید که قبل از اعمال تغییرات حالات رکوردها هم باید در جایی ذخیره شوند. به عنوان مثال اگر رکوردی اضافه میشود باید بدانیم که کدام رکورد اضافه شده است و یا اگر رکوردی آپدیت شده باید بدانیم که کجایش تغییر کرده که در صورتی که تراکنش ناموفق بود بتوانیم داده های تغییر یافته را مجدداً به حالت اول برگردانیم. به عبارتی دیگر می توانیم این مسائل را هم در یک فایل دیگر ذخیره کنیم.
4- مسئله اصلی اینجاست که اگر ور میان کار برق رفت بعداً از کجا باید بفهمیم که تراکنش کامل انجام شده است یا خیر؟ در این حالت طبیعی است که با اختصاص یک فلگ به هر تراکنش می توانیم این مورد را بررسی کنیم. به عنوان مثال می توانیم این فلگ را در همان فایلهای مربوطه قرار دهیم و به آن مقدار صفر را انتصاب دهیم و اگر توانستیم همه دستورات یک تراکنش را با موفقیت انجام دهیم به آن مقدار یک را نسبت می دهیم. حالا اگر وسط اجرای یک تراکنش برق رفت، ما می توانیم با چک کردن فلگ مربوطه متوجه شویم که تراکنش تا انتها اجرا نشده است و با استفاده از فایلهای جانبی که برای حفظ حالات رکوردها بر روی دیسک ذخیره کرده ایم می توانیم در همان ابتدای اجرای مجدد RDBMS خودمان(!) حالت رکوردها را به همان حالات قبل از اجرای تراکنش برگردانیم.
طبیعی است که این مواردی که ذکر کرده ام فقط حالات بسیار کلی را شامل می شود و در عمل باید موارد بسیار زیاد دیگری در نظر گرفته شود.