JavadAgha
JavadAgha
خواندن ۳ دقیقه·۸ ماه پیش

سطوح ایزولاسیون پایگاه داده

سطوح ایزولاسیون پایگاه داده چیست؟ و برای چه چیزی استفاده می‌شود؟

ایزولاسیون پایگاه داده به تراکنش‌ها اجازه می‌دهد که به عنوان اینکه هیچ تراکنش دیگری در حال اجرا نیست، اجرا شوند. نمودار زیر چهار سطح ایزولاسیون را نشان می‌دهد.

ایزولاسیون پایگاه داده
ایزولاسیون پایگاه داده


قابلیت سریالی‌سازی (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 کار کنه:

  • تراکنش A می تونه موجودی حساب مشتری X رو ببینه، حتی اگر تراکنش B هنوز کامل نشده باشه.
  • این باعث میشه تراکنش A مقدار اشتباهی رو برداشت کنه.

اگر پایگاه داده در سطح READ COMMITTED کار کنه:

  • تراکنش A فقط می تونه موجودی حساب مشتری X رو ببینه که توسط تراکنش های قبلی commit شده.
  • این باعث میشه تراکنش A مقدار صحیحی رو برداشت کنه.

اگر پایگاه داده در سطح REPEATABLE READ کار کنه:

  • تراکنش A نه تنها موجودی حساب مشتری X رو که توسط تراکنش های قبلی commit شده می بینه، بلکه امکان دیدن داده هایی که توسط تراکنش B در حال تغییر هستن رو هم نداره.
  • این باعث میشه تراکنش A مقدار صحیحی رو برداشت کنه و از مشکل "Phantom Read" جلوگیری بشه.

اگر پایگاه داده در سطح SERIALIZABLE کار کنه:

  • تراکنش ها به صورت کاملا سریالی اجرا میشن و هیچ تداخلی بین اونها وجود نداره.
  • این باعث میشه هیچ مشکلی در اجرای تراکنش ها پیش نیاد.


انتخاب سطح ایزولاسیون مناسب بستگی به نیازهای برنامه داره. اگر نیاز به بیشترین ایزولاسیون باشه، SERIALIZABLE بهترین گزینه هست. اما اگر نیاز به بیشترین عملکرد باشه، READ COMMITTED یا READ UNCOMMITTED مناسب تره.


تراکنشپایگاه داده
کنجکاو در مباحث مهندسی نرم افزار
شاید از این پست‌ها خوشتان بیاید