یکی از ویژگیهای شاخص پایگاههای داده، پردازش حجم زیادی از درخواستهای همزمان است که در هر ثانیه انجام میشود. در بسیاری از موارد، درخواستهای مورد نظر، به «داده» مشابه و یکسانی در پایگاه داده اشاره میکنند. برای مثال، تصور کنید که در حال خرید تعدادی نسخه از بازی کامپیوتریِ مورد علاقه خود در یک فروشگاه اینترنتی هستید و تمام افراد حاضر در فروشگاه آنلاین نیز، همان بازی را همزمان در سبد خرید خود قرار دادهاند، سپس همگی اقدام به پرداخت هزینه آن میکنند. بنابراین، آمار موجودی باقیمانده از بازی مورد نظر، باید بهطور دقیق محاسبه شود. معمولاً در چنین سناریوهایی از مفهومی بهنام «تراکنش پایگاه داده» استفاده میشود. در این مطلب از مجله تم آف یاد میگیریم که تراکنش در پایگاه داده چیست و ويژگیهای آن را مورد بررسی قرار خواهیم داد.
اصطلاح «Transaction» یا «تراکنش» بهصورتی که در فرهنگ لغات «کمبریج» آمده است، اشاره به موقعیتی دارد که در آن، یک فرد، چیزی را خریداری کرده یا میفروشد یا به زمانی اشاره دارد که مبلغی پول مبادله میشود.
تراکنش در پایگاه داده چیست؟
به طور خلاصه، «تراکنش پایگاه داده» (Database Transaction) را میتوان بهصورت دنبالهای از چندین عملیات در نظر گرفت که روی پایگاه داده صورت میگیرد.
تمامی این عملیات بهعنوان یک واحد منطقیِ کاری یا «واحد کاری» (Unit of Work)، عمل میکنند. یعنی اجرای آنها یا بهطور کامل صورت میگیرد، یا اینکه اصلا انجام نمیشود. به بیان دیگر، هرگز موردی وجود نخواهد داشت که در آن، فقط قسمتی از عملیات، انجام و نتایج حاصل، ذخیره شده باشد. هنگامیکه تراکنش پایگاه داده در حال اجرا است، وضعیت پایگاه داده ممکن است بهطور موقت «ناسازگار» باشد، اما هنگامیکه تراکنش تایید شود (یا پایان یابد)، تغییرات روی پایگاه داده، اِعمال میشوند.
لازم به ذکر است که «واحد کاری»، الگویی رفتاری در توسعه نرمافزار محسوب میشود. به گفته «مارتین فاولر»، این مفهوم، شامل تمام اقداماتی است که در طول معاملهای تجاری صورت میگیرد و میتواند پایگاه داده را تحت تاثیر قرار دهد. پس از انجام «واحد کاری»، تمام مقدمات لازم برای تغییر پایگاه داده (بهعنوان خروجی کار) فراهم میشود.
برای اینکه درک بهتری نسبت به مفهوم «تراکنش پایگاه داده» پیدا کنیم، به بیان مثالی ساده در مورد انتقال مبلغی پول از «حساب A» به «حساب B» میپردازیم. فرض کنید که میخواهیم «۵۰۰۰» تومان را «حساب A» برداشت و به «حساب B» واریز کنیم. این فرایند «انتقال وجه» را میتوانیم به مراحلی که در ادامه آمده است، تقسیم کنیم.
- رکوردی برای انتقال «۵۰۰۰» تومان از «حساب A» به «حساب B» ایجاد میکنیم. این مورد معمولا «شروع» تراکنش پایگاه داده نامیده میشود.
- موجودی «حساب A» را بهدست میآوریم.
- «۵۰۰۰» تومان از موجودی «حساب A» کسر میکنیم.
- موجودی «حساب B» را بهدست میآوریم.
- به میزان «۵۰۰۰» تومان به اعتبار «حساب B» اضافه میکنیم.
اکنون، اگر پایگاه داده ما، این تراکنش را بهعنوان واحد غیر قابل تقسیم، اجرا کند و در حین آن، سیستم به دلایلی (مانند قطع برق) از کار بیفتد، این تراکنش را میتوان لغو (و خنثی) کرد و پایگاه داده را به حالت اولیه بازگرداند. بهطورکلی، ۲ اصطلاح در این مورد وجود دارد، اصطلاح «عقبگرد» (Rollback)، به این معنا که هرگونه تغییر ایجاد شده بهوسیله تراکنش را خنثی میکند و اصطلاح «تثبیت» (Commit)، که به تغییرات دائمیِ انجام شده بهوسیله تراکنش، اشاره دارد.
لزوم وجود تراکنش پایگاه داده چیست ؟
در ادامه، مواردی بیان شده است که ضرورت وجود تراکنشها در پایگاه داده را بیان میکند.
- خرابی سیستمها، امری اجتناب ناپذیر است و در این گونه موارد، مفهوم «تراکنش»، راهی را برای اطمینان از «قابل اعتماد بودن» (Reliable) و «سازگاریِ» (Consistent) خروجی، فراهم میکند. به بیانی دیگر، پایگاه داده، تمام تغییراتِ تراکنشیِ تثبیت شده قبل از وقوع خرابی را نگه میدارد و تراکنشهای ناتمام در هنگام وقوع خرابی را بهطور کامل خنثی میکند.
- هنگامیکه درخواستهای متعددی به سرور پایگاه داده وارد میشوند و میخواهند تا دادههای یکسانی را تغییر دهند، «تراکنش» میبایست این درخواست را از یکدگیر جدا کند تا تداخلی رخ ندهد.
روش کار تراکنش های پایگاه داده چیست؟
تراکنشِ پایگاه داده در طی چرخه حیات خود، ممکن است چندین وضعیت را تجربه کند. این «حالات تراکنشی» (Transaction States)، ممکن است یکی از مواردی باشند که در ادامه بیان شده است.
- حالات فعال (Active States): اولین حالتی است که در حین اجرای تراکنش ایجاد میشود. یک تراکنش تا زمانی فعال است که دستورالعملهای آن (عملیات خواندن یا نوشتن) انجام میشوند.
- تثبیت جزئی (Partially Committed): در این حالت، تغییری صورت گرفته است اما پایگاه داده هنوز آن را روی دیسک تثبیت نکرده است. یعنی در این حالت، دادهها در بافر حافظه ذخیره شدهاند ولی هنوز روی دیسک نوشته نشده است.
- تثبیت (Committed): در این حالت، تمام بهروزرسانیهای تراکنش، بهطور دائمی (و قطعی) در پایگاه داده ذخیره میشوند. بنابراین، پس از عبور از این مرحله، امکان «بازگشتِ» (Rollback) تراکنش وجود ندارد.
- ناموفق (Failed): اگر تراکنش، در حالت فعال یا تثبیت جزئی، با شکست مواجه یا اینکه لغو شود، اصطلاحاً میگوییم که وارد حالت «ناموفق» شده است.
- حالت خاتمه: آخرین حالت و وضعیت نهایی تراکنش، پس از حالت تثبیت یا لغو را بیان میکند. در حقیقت، این وضعیت، نشاندهنده پایانِ چرخه حیاتِ تراکنشِ پایگاه داده است.
خواص اسید چیست و چرا اهمیت دارند؟
در «پایگاه داده رابطهای» (Relational Database)، تراکنشها باید «تجزیهناپذیر» یا «اتمی» (Atomic)، «سازگار» (Consistent)، «ایزوله» (Isolated) و «بادوام» (Durable) باشند که این ویژگیها را معمولاً به اختصار، «ACID» مینامند.
خواص «ACID»، تضمین میکند که تراکنش پایگاه داده بهطرزی قابل اعتماد، پردازش میشود. در ادامه، به این میپردازیم که ویژگیهای «ACID» چه معنایی را برای اپلیکیشنها بههمراه دارند.
ویژگی Atomicity تراکنش در پایگاه داده چیست ؟
«تجزیهناپذیری» یا «Atomicity» در تراکنش، به معنای «یا همه یا هیچ» است. هنگامیکه تراکنش تثبیت میشود، پایگاه داده، یا آن را با موفقیت به انجام میرساند یا اینکه آن را لغو و خنثی میکند (و در نتیجه پایگاه داده به حالت اولیه خود برمیگردد). بهعنوان مثال، در برنامه آنلاین بلیطفروشی، عملیات رزرو بلیت، ممکن است خود، ۲ عمل جداگانهای را شامل شود که با هم، تراکنشی واحد را تشکیل میدهند. این ۲ بخش، شامل «رزرو صندلی برای مشتری» و «پرداخت هزینه صندلی» است.
یک تراکنش تضمین میکند که با انجام عملیات رزرو بلیت، هر دوی این اقدامات، اگرچه مستقل هستند، اما در یک معامله انجام میشوند. اگر هر یکی از این اقدامات به شکست بیانجامد، کل تراکنش لغو میشود (و پایگاه داده به وضعیت قبلی خود برمیگردد). پس از آن نیز، عملیات رزرو برای تراکنش دیگری که منتظر آن است، آزاد میشود.
ویژگی Consistency تراکنش در پایگاه داده چیست ؟
یکی از مهمترین مزایایِ بهکارگیری تراکنشها، حفظ یکپارچگی دادهها، صرفنظر از موفقیت یا شکست آن است. تراکنشها، دادههای مربوطه را فقط بهگونهای که توسط سیستم پایگاه داده، مجاز باشد، میتوانند تغییر دهند. همچنین باید اطمینان داشته باشیم از اینکه چشماندازی ثابت از دادهها، همیشه حفظ میشود.
به عنوان مثال، هنگامیکه کاربران مبلغی را در برنامه بانکداری آنلاین واریز میکنند، مایلند تا نتیجه این عملیات را بلافاصله در موجودی حساب خود مشاهده کنند تا مطمئن شوند که پول آنها از بین نرفته است. با وجود ثبات و «سازگاری» (Consistency) در تراکنشها، کل مقدار پولی که در بانک وجود دارد، همیشه باید بدون تغییر باقی بماند (نسبت به میزانی که باید وجود داشته باشد).
پس از تکمیل تراکنش (تثبیت آن)، تراکنش بعدی، صرف نظر از اینکه چه «رونوشتی» (Replica) آن را پردازش میکند، تمام دادههای نوشته شده توسط تراکنش قبلی را میخواند. با این حال، در پایگاههای داده بزرگ که چندین «Replica» در مکانهای مختلفی دارند، اکثر سیستمهای «SQL» و «NoSQL» نمیتوانند از یکنواختی (سازگاری) در بین همه رونوشتها، اطمینان حاصل کنند. در عوض، رونوشتها میتوانند موقتاً از هم جدا شوند و در نتیجه، حاصل یک تراکنش ممکن است بسته به رونوشتی که به آن هدایت میشود، متفاوت باشد.
لازم به ذکر است که منظور از «رونوشت» (Replica)، تهیه نسخههایی از پایگاههای داده، روی منابع مختلف، برای اطمینان از حفظ سازگاری، «تحملپذیری در مقابل خطا» و «قابل اعتماد بودن» است.
ویژگی Isolation تراکنش در پایگاه داده چیست ؟
زمانیکه چندین تراکنش، همزمان با هم اجرا میشوند، هر یک از آنها باید بهطور مستقل و «ایزوله شده» نگهداری شوند. بهگونهای که روی اجرای همزمانِ تراکنشهای دیگر تأثیر نگذراند.
برای اکثر سیستمهای پایگاه داده، ترتیب تراکنشها، از قبل مشخص نیست و اجرای تراکنشها بهصورت موازی است و از سازوکار «قفل کردن پایگاه داده» استفاده میشود تا اطمینان حاصل کنیم که نتیجه یک تراکنش بر تراکنش دیگری تأثیر نمیگذارد. به طور معمول، پایگاههای داده، برای کنترل درجه یکپارچگی تراکنش، «سطوح جداسازی» (Isolation Levels) مختلفی را فراهم میکنند.
در سالهای اخیر، پایگاههای دادهای «نو اسکیواِل» (NoSQL) محبوبیت زیادی پیدا کردهاند. گرچه برخی از این پایگاههای داده، با قوانین «ACID» سازگاری دارند، اما بسیاری از آنها چنین نیستند. بهطوریکه ممکن است برخی از سازگاریها را نادیده بگیرند یا فرایندهایی مانند «ایزولهسازی اسنپشات» را ارائه میدهند. هنگام طراحی اپلیکیشن خود و انتخاب پایگاههای داده «NoSQL»، لازم است تا به اینکه تراکنشها را به چه صورتی انجام میدهند و آیا الزامات ما برای یکپارچگی دادهها را برطرف میکنند یا خیر، بهخرج دهیم.
ویژگی Durability در تراکنش در پایگاه داده چیست ؟
«با دَوام بودن» (Durability) یعنی، تراکنشی که با موفقیت ثبت شده است، برای همیشه باقی میماند. در راستای این هدف، برای هر تراکنش موفق، رکوردی به «گزارش تراکنشهای پایگاه داده» اضافه میشود.
زمان بندی تراکنش در پایگاه داده چیست ؟
مجموعه اقداماتی که از یک تراکنش به تراکنش دیگر انجام میشود را برنامهزمانی یا «زمانبندی» (Schedule) میگویند.
زمانبندیها در تراکنشهای پایگاه داده را میتوان به ۳ دسته «زمانبندی سریالی»، «زمانبندی غیرِ سریالی» و «زمانبندی قابلِ سریالی شدن» تقسیم کرد. در ادامه، هر یک از این موارد را مورد بررسی قرار میدهیم.
زمان بندی سریالی چیست؟
برنامهزمانی سریالی، نوعی زمانبندی است که در آن، پیش از آنکه تراکنشی شروع شود، میبایست تراکنش قبلی بهطور کامل اجرا شده باشد. در این نوع برنامهزمانی، هنگامیکه اولین تراکنش، چرخه خود را به پایان رساند، سپس تراکنش بعدی اجرا میشود. مثالی که در ادامه آمده است را در نظر بگیرید. فرض میکنیم که ۲ تراکنش با نامهای «T1» و «T2» وجود دارند که برخی عملیات (اقدامات) را شامل میشوند. اگر «درهم آمیختگی» (Interleaving) در این اقدامات وجود نداشته باشد، ۲ نتیجه احتمالی برای آن وجود دارد، که در ادامه بیان شده است.
- تمامی عملیات مربوط به «T1» را اجرا میکنیم، پس از آن به سراغ اجرای عملیات «T2» میرویم.
- ابتدا عملیات مربوط به «T2» را اجرا میکنیم، سپس، اقدامات «T1» را انجام میدهیم.
همانطور که در تصویر مشاهده میکنید، «زمانبندی A»، زمانبندی سریالی را نشان میدهد که در آن ابتدا «T1» و سپس «T2» اجرا میشود. «زمانبندی B» نیز، زمانبندی سریالی را نشان میدهد که در آن ابتدا عملیات مربوط به «T2» و سپس عملیات «T1» اجرا میشود.
زمان بندی غیر سریالی چیست؟
برخی از خصوصیات این نوع زمانبندی، در ادامه، آورده شده است.
- اگر در عملیات تراکنشها، درهم آمیختگی وجود داشته باشد، در اینصورت با «زمانبندی غیرسریالی» (Non-Serial Schedule)، روبهرو هستیم.
- در این نوع زمانبندی، راههای متعددی در مورد ترتیب اجرای اقدامات تراکنشی در سیستم وجود دارد.
«زمانبندی C» و «زمانبندی D»، بیانگر زمانبندی غیر سریالی هستند و درهم آمیختگی عملیات را نشان میدهند.
زمان بندی قابل سریالی شدن چیست؟
در ادامه، برخی از نکات مربوط به زمانبندی «قابل سریالی شدن» را فهرست کردهایم.
- این توانایی، به دنبال کشف زمانبندیهای غیرسریالی بهکار میرود که امکان اجرای تراکنش را بهطور همزمان فراهم میکنند، بدون اینکه تداخلی با یکدیگر داشته باشند.
- زمانبندی دقیق برای اجرای تراکنشهایی که دارای درهمآمیختگی در اقدامات خود هستند را تعیین میکند.
- زمانبندی غیر سریالی، در صورتی قابل سریالی شدن خواهد بود که نتیجه آن با نتیجه اجرای سریالی تراکنشهایش برابر باشد.
با توجه به تصاویری که دیدیم، «زمانبندی A» و «زمانبندی B»، از نوع سریالی و «زمانبندی C» و «زمانبندی D»، غیر سریالی محسوب میشوند.
سوالات متداول
در این بخش، برخی از سوالات رایج و پُر تکرار، در مورد تراکنش در پایگاه داده را مورد بررسی قرار دادهایم.
منظور از اسید در تراکنش پایگاه داده چیست ؟
خاصیت اسید در تراکنشِ پایگاه داده، به ویژگیهای تجزیهناپذیری، سازگاری، ایزولهشدن و دوام اشاره دارد.
کاربرد commit در تراکنش پایگاه داده چیست ؟
تثبیت، برای ذخیره کار انجام شده بهصورت دائمی مورد استفاده قرار میگیرد.
کاربرد rollback در تراکنش پایگاه داده چیست ؟
عقبگرد یا بازگشت، برای لغو کارِ انجام شده، استفاده میشود.
مزیت تراکنش در پایگاه داده چیست؟
پایگاههای دادهای تراکنشی، برای اجرای کارآمدِ سیستمهای تولیدی، از وبسایتها گرفته تا بانکها و فروشگاههای خردهفروشی، بهینه شدهاند. این پایگاههای دادهای، در خواندن و نوشتن ردیفهای مجزای دادهای، بسیار سریع هستند و در عین حال، یکپارچگی دادهها را نیز، حفظ میکنند.
جمعبندی
در این مطلب از مجله تم آف، با تشریحِ پاسخ به این پرسش که «تراکنش در پایگاه داده چیست»، علاوهبر تعریف، خصوصیات مهم آن را نیز بیان کردیم.
همچنین گفتیم که ویژگیهای تراکنش، که به اختصار «ACID» نام دارد، در حقیقت، بیانگر مواردی همچون «تجزیهناپذری»، «سازگاری»، «ایزولهسازی» و «دوامِ بالا»، هستند. در پایان نیز، موضوع اجرایِ سریالی و غیر سریالی تراکنشها را نیز بررسی کردیم. تراکنش در پایگاه داده، تجربه خوبی را از طریق ارائه خدماتی سازگارتر، برای مشتریها فراهم میکند.