وقتی بنا به صحبت راجع به دیتابیس ها داشته باشیم یکی از اصلی ترین مفاهیم که باید مدنظر ما باشد Transaction ها و ACID هست.
اسید - ACID (Atomicity, Consistency, Isolation, Durability) به طور کلی تضمینی برای انجام صحیح تراکنش هاست و این خصوصیات وقتی از همزمانی(concurrency) در سیستم استفاده کنیم بیشتر به چشم میآید.به این معنا که عملیات هایی که در سیستم همزمان انجام میشوند با رعایت خواص اسید ضمانت میشوند.
در میان این ویژگی ها؛ isolation مشخص میکند که یک تراکنش در نظر کاربران و سیستمهای مرتبط به گونهای محافظت شود که بتوان متصور شد تنها تراکنش در حال انجام در آن پایگاه داده است.
حال میپردازیم به موضوع اصلی این نگارش: Isolation Levels - این سطوح مشخص میکنند هر تراکنش در چه لایهای باید از تراکنش در برابر تغییرات اعمال شده از سوی دیگر تراکنش ها محافظت کند.
این سطوح در پایگاه داده SQL به ترتیب زیر میباشد:
- سطحی ترین لایه جداسازی است که عملا در این سطح یک تراکنش میتواند تغییرات commit نشده توسط یک تراکنش دیگر را بخواند. اصطلاحا به این خوانش «dirty read» گفته میشود. در این لایه isolation وجود ندارد.
- در این لایه پایگاه داده ضمانت میکند هر تراکنش تنها دسترسی به تغییرات commit شده دارد و dirty read در آن ممکن نیست.
- این لایه تقریبا مشابه لایه قبلی عمل میکند با این تفاوت که تا زمانی که تمامی خوانش ها در یک ردیف انجام نگیرد تراکنش را قفل کرده و امکان ایجاد تغییر روی داده را به دیگر تراکنش ها نمیدهد.
بیشترین سطح جداسازی و انزوا برای تراکنش ها در این لایه صورت میگیرد. در این لایه پایگاهداده عملیات هایی که به صورت همزمان قرار است در سیستم انجام شود را به صورت serially و پشتِسرِ هم انجام میدهد و به طور کامل از رخدادِ Phantom Reads در پایگاه داده جلوگیری میکند.
(هنگامی که دستور SELECT ما با یک عملیات تغییر در پایگاه داده همزمان شود و آن تراکنش قصد اثر گذاشتن بر خوانش ما داشته باشد میگوییم Phantom Reads رخ داده است)
-- هنگام انتخاب زبان یا Framework برای توسعه یک سیستم دادهمحور؛ از مهمترین نکات قابل بررسی میتوان به ORM آن زبان و میزان پشتیبانی آن از لایه های جدا سازی؛ و ارزیابیِ آن با توجه به نیازمندی سیستم اشاره کرد.