آشنایی با ویژگیها و حالات تراکنش در پایگاه داده
تراکنش در پایگاه داده را میتوان به عنوان گروهی از وظایف تعریف کرد. یک وظیفه، واحد حداقل واحد پردازش است که نمیتوان آن را بیشتر تقسیم کرد.
تراکنش در پایگاه داده چیست؟
در یک سیستم مدیریت پایگاهداده، یک تراکنش یک واحد منطق یا کار است که از چندین عملیات یا حتی یک عملیات تشکیل شده است. هر محاسبه منطقی انجام شده در یک حالت ثابت در پایگاهداده به عنوان یک تراکنش شناخته میشود. …یک تراکنش برای اینکه بتواند به درستی در پایگاهداده اجرا شود، باید یک سری ویژگیها داشته باشد. این ویژگیها اختصارا ACID نامیده میشوند.
چهار ویژگی اصلی تراکنشها در پایگاهداده (خواص ACID)
یک تراکنش واحد بسیار کوچکی از یک برنامه است و ممکن است شامل چندین وظیفهی سطح پایین باشد. یک تراکنش در یک سیستم پایگاهداده باید این چهار ویژگی را داشته باشد: اتمیک(قابل تقسیم به تراکنشهای ریزتر نباشد)، سازگار، تفکیک شده باشد و دایمی (معمولاً این چهار ویژگی به عنوان ویژگیهای ACID شناخته میشود) این ویژگیها برای این هستند که از دقت، کامل بودن و یکپارچگی دادهها اطمینان حاصل شود. در ادامه به تعریف هر یک از این چهار ویژگی میپردازیم.
اتمیک بودن (Atomicity)
این ویژگی بیان میکند که یک تراکنش باید به عنوان یک واحد غیرقابل تجزیه در نظر گرفته شود، یعنی یا تمام عملیات آن اجرا میشود یا هیچکدام از مراحل آن. هیچ وضعیتی در پایگاهداده نباید وجود داشته باشد که فقط قمستی از یک تراکنش انجام شده باشد. وضعیتها باید قبل از اجرای معامله یا بعد از اجرا/اسقاط/شکست معامله تعریف شوند. به عبارتی، هیچکس یک تراکنش را نمیبند مگر اینکه تراکنش کامل انجام شود.
سازگاری (Consistency)
پایگاهداده باید پس از هر تراکنش در حالت ثابت باقی بماند. هیچ تراکنشی نباید بر روی دادههای موجود در پایگاهداده تأثیر منفی داشته باشد. اگر پایگاهداده قبل از اجرای تراکنش در وضعیت ثابتی بود، پس از اجرای تراکنش نیز باید ثابت بماند. به عبارتی تغییر تنها در صورتی میتواند اتفاق بیفتد که وضعیت جدید سیستم معتبر باشد؛ هر تلاشی برای انجام یک تغییر نامعتبر با شکست مواجه خواهد شد و سیستم در وضعیت معتبر قبلی خود باقی میماند. به طور مثال نمیتوان از حسابی با موجودی ۳۰۰ هزار تومان، ۵۰۰ هزار تومان برداشت کرد و موجودی به -۲۰۰۰۰۰ هزار تومان برسد… این تراکنش کلا با قوانین پایگاهداده سازگاری ندارد و شکست میخورد. هیچ برداشتی صورت نگرفته و هیچ موجودی از حساب کسر نمیشود.
دوام (Durability)
پایگاهداده باید به اندازه کافی بادوام باشد تا بتواند آخرین به روز رسانیهای خود را نگه دارد، حتی اگر سیستم از کار بیفتد یا ریستارت شود، نباید اطلاعات آن از بین رفته باشند. اگر تراکنش، تکهای از دادهها را در یک پایگاهداده به روز کند و آنها را ثبت نهایی(commit) کند، آنگاه پایگاهداده، دادههای اصلاح شده را نگه میدارد. اگر یک تراکنش انجام شود اما قبل از اینکه دادهها روی دیسک نوشته شوند، سیستم از کار بیفتد، پس از بازگشت سیستم به کار، آن دادهها به روز میشوند.
مستقل بودن (Isolation)
در یک سیستم پایگاهداده که بیش از یک تراکنش به طور همزمان و به صورت موازی اجرا میشوند، خاصیت مستقل بودن بیان میکند که تمام تراکنشها به گونه ای انجام و اجرا میشوند که انگار هر کدام از آنها جداگانه و به تنهایی انجام شدهاند. به عبارتی هیچ معاملهای بر معامله دیگری تأثیر نخواهد گذاشت.
اجازه دهید این ویژگی را با ذکر یک مثال توضیح دهیم. فرض کنید موجودی یک حساب ۷۰۰ هزارتومان است و دو تراکنش قرار است روی آن انجام شود. تراکنش
شماره ۱: مبلغ ۳۰۰ هزار تومان از حساب کسر شود.
تراکنش ۲: مبلغ ۵۰۰ هزار تومان به حساب اضافه شود.
اگر اول تراکنش یک انجام شود بعد تراکنش دو، موجود اول از ۷۰۰ هزارتومان به ۴۰۰ هزار تومان میرسد و سپس از ۴۰۰ هزار تومان به ۹۰۰ هزار تومان.
اگر اول تراکنش دو انجام شود و سپس تراکنش اول: ابتدا مبلغ ۵۰۰ هزار تومان به ۷۰۰ هزارتومان اضافه میشود و سپس ۳۰۰ هزار تومان به دلیل تراکنش دوم کسر میشود. و در نهایت موجودی ما ۹۰۰ هزار تومان خواهد بود. همان چیزی که در حالت اول به دست آمد.
انواع حالتهای تراکنش پایگاهداده
با توجه به اینکه یک تراکنش، در چه وضعیتی قرار دارد، میتوان تراکنشها را دسته بندی کرد.
حالت فعال (Active)
هنگامی که دستورالعملهای تراکنش در حال اجرا هستند، تراکنش در حالت فعال است. اگر تمام عملیات «خواندن و نوشتن» بدون هیچ خطایی انجام شود، به «وضعیت جزئی متعهد» میرود. اگر هر یک از ریزدستورات با شکست مواجه شود، به “وضعیت شکست خورده” میرود.
تا حدی تمام شده (Partially Committed)
پس از اتمام تمام عملیات خواندن و نوشتن، تغییرات در حافظه اصلی یا بافر محلی ایجاد میشود. اگر تغییرات در پایگاهداده دائمی شوند، وضعیت به “وضعیت تمام شده” تغییر میکند و در صورت خرابی به “وضعیت شکست خورده” میرود.
حالت شکست خورده (Failed)
هنگامی که هر دستورالعمل تراکنش با شکست مواجه میشود، به “وضعیت شکست خورده” میرود. البته اگرتراکنش درست انجام شود ولی ثبت دایمی تغییرات آن امکان پذیر نباشد، باز هم تراکنش شکست میخورد.
حالت لغو شده (Aborted)
پس از هر نوع شکست، تراکنش از “وضعیت ناموفق” به “حالت سقط شده” میرود و از آنجایی که در حالتهای قبلی، تغییرات فقط در بافر محلی یا حافظه اصلی انجام شدهاند، اینجا این تغییرات حذف یا برگشت داده میشوند.
وضعیت خاتمه بافته یا تمام شده (Committed)
حالتی است که تغییرات در پایگاهداده دائمی میشود و تراکنش کامل میشود و بنابراین در “حالت خاتمه یافته” خاتمه مییابد.
حالت پایان یافته
اگر هیچ راه و وضعیت بازگشتی وجود نداشته باشد یا تراکنش در “وضعیت متعهد” باشد، سیستم سازگار و آماده برای تراکنش جدید است و تراکنش قدیمی خاتمه مییابد.
تعریف سریال بودن و موازی بودن تراکنشها
هنگامی که چندین تراکنش توسط سیستم عامل در یک محیط چندبرنامهنویسی اجرا میشود، این احتمال وجود دارد که دستورالعملهای یک تراکنش با تراکنشهای دیگر تداخل پیدا کند. به طور مثال زمانی که تراکنشها قرار است روی یک داده انجام شوند یا یک داده بین آنها مشترک باشد.
زمانبندی: به دنباله اجرای زمانی یک تراکنش، زمانبندی میگویند. یک جدول زمانی میتواند تراکنشهای زیادی را در خود داشته باشد که هر کدام شامل تعدادی دستورالعمل/وظیفه است.
برنامه زمانبندی، همانطور که از نام آن پیداست، فرآیندی است که تراکنش ها را ردیف می کند و آنها را یک به یک اجرا می کند. زمانبندی وقتی وارد عمل میشود که چندین تراکنش وجود دارد که به صورت همزمان در حال اجرا هستند و باید ترتیب عملیات را طوری تنظیم کنید که با یکدیگر همپوشانی نداشته باشند. در اینجا به انواع مختلف برنامه ها می پردازیم.
برنامه های زمانبندی سریال
برنامههایی که در آن تراکنشها بهصورت جداگانه اجرا میشوند، و تداخلی با هم ندارند. بهعنوان مثال، یک برنامه، زمانی که در آن هیچ تراکنشی تا پایان یک تراکنش در حال اجرا شروع نمیشود، برنامههای سریال نامیده میشوند.
برنامه زمانبندی زمانبندی غیر سریال:
یک نوع زمانبندی است که در آن عملیات چندین تراکنش به هم متصل میشوند. این امر ممکن است منجر به افزایش مشکل همزمانی شود. تراکنشها به صورت غیر سریالی انجام میشوند و نتیجه نهایی را درست و مانند یک زمانبندی برنامه سریال، انجام میدهند. برخلاف برنامه زمانی سریال که در آن یک تراکنش باید منتظر بماند تا تراکنش دیگری تمام عملیات خود را کامل کند، در برنامه زمانی غیر سریالی، تراکنش دیگر بدون انتظار برای تکمیل تراکنش قبلی انجام می شود.
جدول زمانی غیر سریال را میتوان به دو دسته قابل سریال و غیر سریال تقسیم کرد.