آخرین بروزرسانی 4 روز قبل

همزمانی پایگاه داده (Database Concurrency) چیست؟

تداخل همزمان در پایگاه داده چیست؟ مدیریت اطلاعات به طور همزمان

سلام دوستان. امروز میخواهیم در مورد یک موضوع مهم در پایگاه داده صحبت کنیم: تداخل همزمان. شاید این اصطلاح کمی ترسناک به نظر برسد، اما نگران نباشید، سعی میکنم خیلی ساده توضیح بدم.

مقدمه: چرا تداخل همزمان مهم است؟

تصور کنید یک فروشگاه آنلاین دارید. همزمان، چندین نفر (کاربر) دارند محصولات را میخرند، اطلاعات را بروزرسانی میکنند و سفارش ثبت میکنند. پایگاه داده شما باید بتواند همه این درخواست ها را به طور همزمان و بدون ایجاد مشکل یا خطا مدیریت کند. اینجاست که "تداخل همزمان" (Concurrency) وارد عمل میشود. اگر پایگاه داده شما نتواند همزمانی را به خوبی مدیریت کند، ممکن است اطلاعات خراب شوند، سفارشات اشتباه ثبت شوند، یا کاربران مجبور شوند زمان زیادی منتظر بمانند. بد میشه، نه؟

تداخل همزمان یعنی چی؟

به زبان ساده، تداخل همزمان یعنی اینکه چندین تراکنش (Transaction) به طور همزمان در حال دسترسی و تغییر اطلاعات در پایگاه داده هستند. یک تراکنش میتواند یک عملیات ساده مثل خواندن یک رکورد باشد، یا یک عملیات پیچیده تر مثل ثبت سفارش و پرداخت آنلاین.

مشکل زمانی پیش میاد که این تراکنش ها با هم تداخل پیدا کنند. مثلا، دو نفر همزمان سعی کنند موجودی یک محصول را کم کنند. اگر این کار به درستی مدیریت نشود، ممکن است موجودی منفی شود! (فرض کنیم فقط یک عدد از آن محصول باقی مانده باشد، هر دو تراکنش آن را بخوانند، و هر دو تراکنش آن را کم کنند. نتیجه: موجودی -1!)

چرا تداخل همزمان ایجاد مشکل می کنه؟

چند دلیل اصلی وجود دارد که تداخل همزمان باعث ایجاد مشکل می شود:

  • از دست رفتن بروزرسانی (Lost Update): وقتی دو تراکنش مقدار یک داده را میخوانند، تغییر میدهند، و دوباره مینویسند، ممکن است یکی از تغییرات از بین برود. همان مثال موجودی محصول.
  • خواندن داده های کثیف (Dirty Read): یک تراکنش داده ای را میخواند که هنوز توسط تراکنش دیگری تایید (Commit) نشده است. اگر تراکنش اول بعدا لغو (Rollback) شود، تراکنش دوم داده های اشتباهی را خوانده است.
  • خواندن غیر قابل تکرار (Non-Repeatable Read): یک تراکنش یک داده را دو بار میخواند، اما در بین این دو خواندن، تراکنش دیگری آن داده را تغییر میدهد. در نتیجه، تراکنش اول مقادیر متفاوتی را میخواند.
  • فانتوم رید (Phantom Read): یک تراکنش یک کوئری (Query) را اجرا میکند که تعدادی رکورد را برمیگرداند. تراکنش دیگری رکوردهای جدیدی را اضافه یا حذف میکند که با کوئری اول مطابقت دارند. اگر تراکنش اول دوباره همان کوئری را اجرا کند، رکوردهای متفاوتی را دریافت میکند.

روش های مدیریت تداخل همزمان

خوشبختانه، پایگاه داده ها روش های مختلفی برای مدیریت تداخل همزمان دارند. این روش ها معمولا بر اساس مفهوم "قفل گذاری" (Locking) کار میکنند. یعنی یک تراکنش قبل از دسترسی به یک داده، روی آن "قفل" میگذارد. تراکنش های دیگر نمیتوانند به آن داده دسترسی پیدا کنند تا زمانی که قفل برداشته شود.

انواع مختلفی از قفل وجود دارد:

  • قفل اشتراکی (Shared Lock): برای خواندن داده استفاده میشود. چندین تراکنش میتوانند به طور همزمان قفل اشتراکی روی یک داده داشته باشند.
  • قفل انحصاری (Exclusive Lock): برای نوشتن یا تغییر داده استفاده میشود. فقط یک تراکنش میتواند قفل انحصاری روی یک داده داشته باشد.

پایگاه داده ها همچنین از روش های دیگری مانند "مهر زمانی" (Timestamping) و "کنترل همزمانی خوش بینانه" (Optimistic Concurrency Control) استفاده میکنند.

یک مثال ساده

فرض کنیم جدولی داریم به نام accounts که موجودی حساب های بانکی را نگهداری می کند:

account_id balance
1 1000
2 500

حالا دو تراکنش داریم. تراکنش اول میخواهد 100 تومان از حساب شماره 1 برداشت کند، و تراکنش دوم میخواهد 200 تومان به حساب شماره 2 واریز کند.

تراکنش اول:


START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 1;  -- مقدار balance = 1000
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; -- مقدار balance را به 900 تغییر بده
COMMIT;
        

تراکنش دوم:


START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 2;  -- مقدار balance = 500
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2; -- مقدار balance را به 700 تغییر بده
COMMIT;
        

اگر این دو تراکنش همزمان اجرا شوند، پایگاه داده باید اطمینان حاصل کند که هیچ کدام از این مشکلات بالا (از دست رفتن بروزرسانی، خواندن داده های کثیف و غیره) رخ ندهد. معمولا پایگاه داده از قفل گذاری استفاده میکند تا مطمئن شود که هر تراکنش به طور ایزوله (Isolated) کار میکند و تغییرات آن به درستی اعمال میشوند.

خلاصه

تداخل همزمان یک چالش مهم در طراحی و مدیریت پایگاه داده ها است. پایگاه داده ها از روش های مختلفی مانند قفل گذاری، مهر زمانی، و کنترل همزمانی خوش بینانه برای مدیریت این تداخلات و حفظ یکپارچگی داده ها استفاده میکنند. اگر شما یک توسعه دهنده وب، یک مدیر پایگاه داده، یا فقط یک فرد علاقه مند به فناوری هستید، درک مفهوم تداخل همزمان برای شما مفید خواهد بود.

امیدوارم این مطلب برای شما مفید بوده باشد. اگه سوالی داشتید در قسمت نظرات بپرسید. در ضممن به نکتا خیلی مهم دقت کنید.

کلیدواژه ها

پایگاه داده، تداخل همزمان، Transaction، قفل گذاری، Database، Concurrency، Locking، Lost Update، Dirty Read، SQL.

تداخل همزمان دقیقا چه مشکلی ایجاد میکند؟
تداخل همزمان میتواند باعث از دست رفتن بروزرسانی ها، خواندن داده های کثیف، خواندن غیر قابل تکرار، و فانتوم رید شود. این مشکلات میتوانند منجر به خراب شدن داده ها و عملکرد نادرست سیستم شوند.
چطور میتوانم از تداخل همزمان در پایگاه داده خودم جلوگیری کنم؟
پایگاه داده ها به طور خودکار مکانیسم هایی برای مدیریت تداخل همزمان دارند. شما باید تراکنش های خود را به درستی تعریف کنید و از قفل گذاری مناسب استفاده کنید. همچنین، استفاده از سطح انزوا (Isolation Level) مناسب در پایگاه داده مهم است.
سطح انزوا چیست؟
سطح انزوا میزان ایزوله بودن تراکنش ها از یکدیگر را تعیین میکند. سطوح انزوای بالاتر، محافظت بیشتری در برابر تداخل همزمان ارائه میدهند، اما ممکن است عملکرد سیستم را کندتر کنند.
اگر من از یک پایگاه داده ساده استفاده میکنم، آیا باز هم باید نگران تداخل همزمان باشم؟
بله. حتی در پایگاه داده های ساده هم تداخل همزمان میتواند مشکل ایجاد کند. بهتر است همیشه به این موضوع توجه داشته باشید و از بهترین شیوه ها (Best Practices) برای مدیریت تراکنش ها پیروی کنید.

به اشتراک گذاشتن این مطلب در شبکه های اجتماعی

امتیاز شما به این مطلب

امتیاز: 5 از 5 (مجموع 1 رای)

اولین نفری باشید که در مورد این مقاله نظر می دهید!

2619- V2
Terms & Conditions | Privacy Policy

techfeed.ir© 2024 All rights reserved