×

TRANSACTIONS در SQLite

فصل سی و سوم :

TRANSACTIONS در SQLite

یک ترنزکشن یا به فارسی تراکنش به یک واحد انجام کار در دیتابسی است. یک تراکنش در واقع انجام یک یا چندتغییر در دیتابیس است .

تراکنش عبارتست از یک واحد کاری که اگر اجرای کل آن موفقیت امیز باشد تمامی اطلاعاتی که در ضمن ان تغییر یافته اند بطور دائمی در دیتابیس ذخیره میشوند (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 رکورد های جدول ما را حذف خواهد کرد.


مفاهیم و موضوعات این فصل عبارتند از :

  • TRANSACTIONS در SQLite

vatantop
نظرات و سوالات درج سوال/ نظر