فصل سی و سوم :
TRANSACTIONS در SQLite
یک ترنزکشن یا به فارسی تراکنش به یک واحد انجام کار در دیتابسی است. یک تراکنش در واقع انجام یک یا چندتغییر در دیتابیس است .
A transaction is a single unit of work
تراکنش عبارتست از یک واحد کاری که اگر اجرای کل آن موفقیت امیز باشد تمامی اطلاعاتی که در ضمن ان تغییر یافته اند بطور دائمی در دیتابیس ذخیره میشوند (Commit) و اگر دچار اشکال شود تمامی تغییرات انجام شده به قبل (Rollback) باز خواهند گشت..در نظر بگیرید جهت انجام محاسباتی نیازمند چندین دستور sql هستیم .مثلا می خواهیم عمیات کارت به کارت را در عابر بانک ها انجام دهیم . ابتدا می خواهیم مبلغ مورد نظر کاربر را از حساب وی کسر کرده و سپس آنرا به حساب مقصد واریز نماییم. در ساده ترین حالت بایستی حد اقل 2 آپدیت انجام دهیم .حال اگر آپدیت اول را انجام دادیم یعنی پول را از حساب کاربر کم کردیم.و در هنگام اجرای آپدیت دوم که باید همان مبلغ را به حساب مقصد واریز کنیم . اشکالی پیش باید مثلا برق قطع شود . سرور دچار مشکل سخت افزاری و یا نرم افزاری شود.
و یا خود دستور آپدیت ما دچار مشکل زمان اجرا شود چه پیش خواهد آمد. پولی از حسابی کم شده ولیکن به حساب مقصد واریز نشده است. بنابراین بایستی مکانیزمی داشته باشیم که تضمین کند یکسرس دستورات sql ما همگی با هم انجام شوند . و اگر مشکلی پیش امد کل تغییرات رخ داده به قبل باز گردد یا اصطلاحا میگوییم rollback شود. یعنی اپدیت اول هم انجام نشود و پولی از حساب کاربر متقاضی ما کم نشود . یا همه اجرا شوند یا هیچکدام
Transaction ها باید دارای 4 خاصیت زیر باشند:
ACID
Atomicity
اتمیک باشند بطور یک واحد عملیاتی که یا همه دستورات آن بدرستی انجام میشود و یا هیچکدام. اگر دراجرا جایی مشکلی پیش آمد تمامی تغییرات به قبل باز خواهند گشت.
Consistency
(ثبات و دوام) این خاصیت تضمین میکند که هر تراکنش دیتابیس را از یک وضعیت صحیح و معتبر به وضعیت معتبر دیگری می برد. یعنی هر دیتایی که در دیتابیس نوشته میشود بایستی بر طبق قواعد و constraints هاو تریگر ها معتبر باشد. مثلا در مثال انتقال پول از یک کارت به کارت دیگر consistency تضمین میکند که قبل و بعد از تراکنش همواره بایستی مجموع پول حسابها برابر باشد. اگر از یک حساب پول برداشته شود حتما بایستی به حسابی دیگر واریز گردد. در غیر اینصورت وضعیت و یا state دیتابیس قبل و بعد از تراکنش با هم فرق خواهد کرد. پس در هنگام بروز خطا بایستی تغییرات انجام شده به قبل باز گردند تا دوباره مجموع پول حسابهای ما برابر شود .و سیستم قبل و بعد از تراکنش دارای وضعیت معتبری باشد
Isolation
تغییرات ایجاد شده توسط یک تراکنش بایستی از تغییرات ناشی از تراکنش های همزمان دیگر ایزوله و مجزا باشد.
یک تراکنش اطلاعات را هم در وضعیت قبل از تغییر توسط تراکنش دیگر می بیند و هم در وضعیت بعد از تراکنش دیگر . ولیکن اطلاعات را در وضعیت مابین اجرای تراکنش دیگر نمی بیند . مثلا در مثال انتقال پول اگر تراکنش دیگری همزمان با این تراکنش اجرا شود . اطلاعات را بگونه ایی که برداشت از حسابی انجام شده ولی هنوز بهب حساب دیگر واریز نشده است نمی بیند . یعنی نتایج ناقص یک تراکنش برای تراکنش دیگر قابل مشاهده نیست .
Durability
پایداری و دوام
هنگامی که یک تراکنش کامل شد تغییرات ناشی از ان بطور دائمی در دیتابیس نوشته میشوند . یعنی هنگامی که یک تراکنش بطور کامل انجام شد.حتی اگر موتور پایاه داده دچار مشکل شود اطمینان داریم که تغییرات ناشی از تراکنش در اطلاعات جداول لحاظ خواهند شد .
تضمین میکند تراکنش کامل شده حتما در اطلاعات جداول لحاظ خواهند شد.
برای کنترل تراکنش ها از دستورات ذیل استفاده میشود :
BEGIN TRANSACTION
جهت شروع یک تراکنش
COMMIT
جهت ذخیره تغییرات بصورت دائم در دیتابیس که همچنین بجای ان میشود نوشت END TRANSACTION
ROLLBACK
برای برگرداندن تغییرات انجام شده و باز گشت به وضعیت قبل از بروز تغییرات
دستورات کنتر تراکنش ها فقط برای DML ها کاربرد دارند یعنی INSERT , UPDATE و DELETE و شما نمی توانید از آنها برای عملی مثل ساخت جداول و یا حذف انها استفاده کنید .
BEGIN TRANSACTION
یک تراکنش با دستور BEGIN TRANSACTION و یا بطور مختصر BEGIN شروع میشود و تراکنش باز میماند تا به اولینCOMMIT و یاROLLBACK برسد. همچنین یک تراکنش اگر دیتابیس بسته شود و یا خطایی رخ دهد نیز بسته خواهد شد.
BEGIN;
or
BEGIN TRANSACTION;
COMMIT
فرض کنید تعدادی دستور در متن یک تراکنش داریم تغییرات بجود آمده ناشی از این دستورات هنگامی در دیتابیس بطور دائمی ذخیره میشوند که این دستور اجرا شود. این دستتور تمامی تغییرات را از آخرین commit و یاrollback موجود در دیتابیس ذخیره میکند.
COMMIT;
or
END TRANSACTION;
ROLLBACK
برای Undo کردن تغییرات در جریان تراکنش وباز گرداندن وضعیت به قبل از تغییرات بکار میرود.
ROLLBACK;
حالا مثالی میزنیم تا کاربرد دستورات بالا واضحتر شود
باز هم جدول COMPANY
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
حالا تاکنشی را مینویسیم که در آن تتمامی رکورد هاییکه AGE انها برابر با 25 است را حذف کند و سر انجام این تغییرات را ROLLBACK میکنیم.
sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;
که نتیجتا در جدول رکورد های ذیل را داریم.
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
در خط دوم دستور حذف رکورد ها را داریم. ولی این یک تراکنش است تا دستور COMMIT و یا ROLLBACK را نداشته باشیم تغییری در دیتابیس ما ذخیره نمیشود. در خط سوم ROLLBACK داریم .یعنی تغییرات بلی را Undo کن. پس در نتیجه می بینیم که رکوردی از جدل ما حذف نشده است.
حالا دستوات ذیل ا اجرا کنید
sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> COMMIT;
و نتیجتا محتویات جدول ما پس از آن می شود :
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
3 Teddy 23 Norway 20000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
در خط سوم تراکنش را COMMIT کردیم . یعنی تغییرات را در دیتابیس ذخیره کن. پس اینبار دستور DELETE رکورد های جدول ما را حذف خواهد کرد.
مفاهیم و موضوعات این فصل عبارتند از :