مشخصه های اصلی یک تراکنش ( ACID )

تا حالا به این مساله فکر کردید که وقتی در مورد یک تراکنش صحبت می کنیم مشخصه های اصلی اون چه چیزهایی هستند ؟ یکی از مفاهیم مهم در سامانه های اطلاعاتی انجام یک تراکنش است . همه برنامه نویس هایی که در حال توسعه سامانه های اطلاعاتی هستند باید در مورد تراکنش و مشخصه های اصلی اون اطلاعات و آگاهی کامل داشته باشند . اصلا تعریف تراکنش چی هست ؟ یک تراکنش مجموعه ای از عملیات خواندن / نوشتن در سطح پایگاه داده است که تمامی این عملیات با هم ، دقت کنید همه با هم ، یا به موفقیت می رسند و یا در صورت خطا هیچ کدام از آن ها اجرا نمی شود .هر تراکنش برای اینکه نگرانی های ما رو در مورد امنیت و ثبات اطلاعات تامین کنه باید ۴ تا مشخصه داشته باشه : Atomicity ConsistencyIsolationDurability اتمیک بودن ( Atomicity )این ویژگی در تراکنش ها به همه یا هیچ ( All or nothing ) معروف است ، در واقع تراکنش در صورتی موفق است که تمام دستوراتی که در آن اجرا می شوند موفق باشند و بر اساس این قاعده دیتابیس باید قادر باشد که در صورت عدم موفقیت دستور n ام ، تمامی دستورات قبلی را رول بک کند . توی این عکس دو تا تراکنش نشون داده شده اولی سه تا عملیات جمع رو انجام داده و هر سه موفق بودند و تراکنش با موفقیت به پایان رسیده و در تراکنش دوم عملیات تفریقی که انجام شده منجر به منفی شدن متغیر X شده و تراکنش به طور کلی حتی با موفق بودن عملیاتی که بر روی متغیر Z انجام شده به حالت قبلی برگردانده ( RollBack ) شده است . ثبات ( Consistency )یک تراکنش در واقع بایستی در هنگام تغییر وضعیت ، اطلاعات را از یک وضعیت صحیح به یک وضعیت صحیح دیگر ببرد .در این تغییر وضعیت دیتابیس هم سعی می کند که هیچ کدام از کلید ها و نوع های داده ای و Trigger ها نباید نقض شوند . برای درک بهتر مساله تصویری که برای توضیح ثبات (‌Atomicity) گذاشتم رو تکرار می کنم : در سطح دیتابیس به کمک یک check constraint سعی شده از منفی شدن متغیر X جلوگیری بشه و این اتفاق توی تراکنش موجب نقص این قاعده شده که دیتابیس از انجام ادامه کار جلوگیری کرده است . محرمانگی ( Isolation )مهم ترین مشخصه ی یک تراکنش سطح محرمانگی آن است . ما می دونیم که اگر تنها یک کاربر به طور همزمان از دیتابیس استفاده کند نگرانی در مورد احتمال ایجاد مغایرت و آنومالی در اطلاعات نخواهیم داشت و اگر اجازه استفاده همزمان به کاربران جهت دسترسی به دیتابیس بدیم کارایی سیستم رو افزایش دادیم ، کاربر شماره یک با جدول یک کار می کند و کاربر شماره دو با جدول دو . اما دسترسی همزمان معضلاتی رو هم ایجاد می کند که دیتابیس بایستی جهت حل این موضوعات مسائل مختلفی در تراکنش ها مدیریت کند. سطح دسترسی یک تراکنش به تغییرات تراکنش های همزمان با خودش رو سطح محرمانگی اون تراکنش تلقی می کنند . دیتابیس این توهم رو برای ما ایجاد می کند که اگر دو کاربر به صورت همزمان و در یک لحظه به اطلاعات یک جدول جهت انجام تراکنش نیاز دارند ، این دو تراکنش قطعا پشت سر هم و یکی پس از دیگری اجرا می شوند و همزمان اجرا نخواهند شد .سطوح مختلف این سطح محرمانگی در دسترسی تراکنش ها به تغییرات یکدیگر بسیار مهم است . برای درک بهتر در نظر بگیرید که تراکنش شماره یک در حال بازیابی کارمندان یک سازمان برای به روز رسانی حقوق آنهاست ، دقیقا در همان لحظه در بخش نیرو انسانی و به واسطه تراکنش دوم فرد جدیدی به سازمان اضافه می شود آیا تراکنش اول بایستی به اطلاعات این فرد جدید دسترسی داشته باشد ؟ دیتابیس با مدیریت سطوح محرمانگی و با توجه به کسب و کار شما اجازه ی جدا سازی این تراکنش ها به نحوی که به اطلاعات یکدیگر دسترسی نداشته باشند دارد ، همین طور در طرف مقابل امکان ایجاد دسترسی را نیز در اختیار شما قرار داده است . دوام یا ماندگاری ( Durability ) یک تراکنش صحیح وقتی به پایان می رسد و با موفقیت در دیتابیس ثبت می شود، فقط توسط یک تراکنش صحیح دیگر قابل تغییر هست و در هیچ شرایطی از دیتابیس پاک نخواهد شد ، همین طور این تراکنش هیچ کدام از قوانین را نقض نکرده است . در نظر بگیرید که شما در یک سیستم خرید بلیط هواپیما اقدام به خرید یک بلیط می کنید و عملیات پرداخت بانکی را انجام می دهید و اطلاعات مربوط به صندلی خود را چاپ می کنید ، دقیقا لحظه ای بعد از پرینت شما سامانه فروش بلیط هواپیما مربوط به خط هوایی مورد نظر دچار نقص فنی شده و از دسترس خارج می شود ، اطلاعات بلیط شما بعد از در دسترس قرار گرفتن مجدد این سامانه باید در دیتابیس حفظ شده باشد و توسط فرد دیگری قابل خریداری نباشد. مفاهیمی که در مورد ‌ACID توضیح دادم موضوع تازه ای نیست و Jim Gray خیلی وقت پیش از این که من به دنیا بیام تو این مقاله این موضوعات رو مطرح کرده بود ، من فقط سعی کردم مطالبی رو که حس می کنم تو این حوزه وقت گذاشتم و مطالعه کردم آروم آروم یه جایی جمع و منتشر کنم که شاید به درد بقیه برنامه نویس ها هم بخوره . امیدوارم که تنبلی نکنم و ادامه این موضوعات رو هم همین جا تو ویرگول بنویسم .