سطوح ایزولاسیون پایگاه داده چیست؟ و برای چه چیزی استفاده میشود؟
ایزولاسیون پایگاه داده به تراکنشها اجازه میدهد که به عنوان اینکه هیچ تراکنش دیگری در حال اجرا نیست، اجرا شوند. نمودار زیر چهار سطح ایزولاسیون را نشان میدهد.
قابلیت سریالیسازی (Serializalble): این بالاترین سطح ایزولاسیون است. تراکنشهای همزمان تضمین میشود که به صورت متوالی اجرا شوند.
قابلیت تکرارپذیری خواندن (Repeatable Read): دادههایی که در طول تراکنش خوانده میشوند، همانطور که تراکنش شروع شده است، ثابت میمانند.
خواندن بعد از کامیت شدن (Read Committed): تغییرات دادهها فقط پس از اقدامات تراکنش قابل خواندن هستند.
خواندن قبل از کامیت شدن (Read Uncommitted):تغییرات دادهها میتوانند توسط سایر تراکنشها قبل از کامیت شدن تراکنش خوانده شوند.
ایزولاسیون توسط MVCC (کنترل سازگاری چند نسخهای) و قفلها تضمین میشود.
به عنوان مثال نمودار زیر قابلیت تکرار پذیری در خواندن پایگاه داده را نشان میدهد تا نحوه کارکرد MVCC را نشان دهد:
دو ستون پنهان برای هر ردیف وجود دارد: transaction_id و roll_pointer. وقتی تراکنش A شروع میشود، یک نمای خواندن جدید با transaction_id=201 ایجاد میشود. به سرعت و پس از آن، تراکنش B شروع میشود و یک نمای خواندن جدید با transaction_id=202 ایجاد میشود.
اکنون تراکنش A مانده را به 200 تغییر میدهد، یک ردیف جدید از لاگ ایجاد میشود و roll_pointer به ردیف قدیمی اشاره میکند. قبل از اینکه تراکنش A کامیت شود، تراکنش B داده مانده را میخواند. تراکنش B مییابد که شناسه تراکنش 201 هنوز کامیت نشده است، پس ردیف بعدی کامیت شده (transaction_id=200) را میخواند.
حتی زمانی که تراکنش A کامیت میشود، تراکنش B همچنان بر اساس نمای خواندن ایجاد شده هنگام شروع تراکنش B داده را میخواند. بنابراین تراکنش B همیشه داده معادل=100 را میخواند.
فرض کنید یک پایگاه داده برای مدیریت حساب های بانکی داریم. در این پایگاه داده، جدول Accounts وجود داره که اطلاعات مربوط به موجودی حساب های مشتریان رو نگهداری میکنه.
حالا فرض کنید دو تراکنش همزمان در حال اجرا هستن:
1. تراکنش A: برداشت 1000 تومان از حساب مشتری X
2. تراکنش B: افزایش موجودی حساب مشتری Y به میزان 2000 تومان
اگر پایگاه داده در سطح READ UNCOMMITTED کار کنه:
اگر پایگاه داده در سطح READ COMMITTED کار کنه:
اگر پایگاه داده در سطح REPEATABLE READ کار کنه:
اگر پایگاه داده در سطح SERIALIZABLE کار کنه:
انتخاب سطح ایزولاسیون مناسب بستگی به نیازهای برنامه داره. اگر نیاز به بیشترین ایزولاسیون باشه، SERIALIZABLE بهترین گزینه هست. اما اگر نیاز به بیشترین عملکرد باشه، READ COMMITTED یا READ UNCOMMITTED مناسب تره.