Բարև Ձեզ սիրելի ընթերցողներ, այսօր ուզում եմ խոսել մի թեմայից, որին մենք հաճախ առնչվում ենք առօրյաում: Խոսքս վերաբերում է բանկերում գործարքների կատարման գործընթացին: Եթե բանկային որևէ գործարքի ընթացքում առաջանում են խնդիրներ և այն չի իրականանում, ապա մինչ այդ կատարված գործողությունները հաջորդաբար գալիս են սկզբնական վիճակին: Ենթադրենք դուք բանկում կատարում եք գումարի փոխանցում: Գումարը ձեր հաշվեհամարից ելել է և մինչև մյուս հաշվեհամարի վրա «նստելը» հանկարծ առաջանում է խնդիր ու գործարքը ընդհատվում է: Դուք նկատած կլինեք, որ խնդիրներ չեք ունենում և գումարը նորից վերադարնում է ձեր հաշվեհամար: Դա կատարվում է ի շնորհիվ ROLLBACK օպերատորի: Այն մինչ ընդհատումը կատարված բոլոր գործողությունները հաջորդաբար վերադարձնում է իրենց սկզբկական վիճակին և դրա շնորհիվ է, որ գումարը չի կորում ու վերադառնում է ձեր հաշվեհամարի վրա:
Վերոհիշյալ գործընթացները տվյալների բազաների մակարդակում ապահովում են TRANSACTION-ները և ROLLBACK-ները: Ծանոթանանք դրանց հետ ավելի մանրամասն:
MySQL-ը լռելյայն աշխատում է գործարքի(transaction) ավտոմատ ավարտման ռեժիմով (autocommit): Սա նշանակում է, որ երբ կատարվում է տվյալների բազայի թարմացում, որը փոփոխում է աղյուսակը, MySQL-ն անմիջապես այդ փոփոխությունները պահում է սկավառակի վրա: Եթե դուք աշխատում եք գործարքների նկատմամբ անվտանգ աղյուսակների (DB և BDB) հետ, ապա կարող եք անջատել գործարքի ավտոմատ ավարտման ռեժիմն այսպես՝
SET AUTOCOMMIT=0;
Գործարքի ավտոմատ ավարտման ռեժիմն անջատելուց հետո, դուք կարող եք օգտագործել COMMIT օպերատորը՝ փոփոխությունները սկավառակի վրա պահելու համար, կամ ROLLBACK, որպեսզի չեղարկեք գործարքի սկզբից կատարված փոփոխությունները:
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summmary=@A WHERE type=1; COMMIT;
ROLLBACK-ի օգտագործման նպատակներն են.
- չեղարկել բոլոր գործարքի սկզբից կատարված փոփոխությունները կամ որևէ պահպանման կետը (SAVEPOINT),
- մաքրել տվյալ գործարքի բոլոր պահպանման կետերը,
- ավարտել գործարքը,
- ազատել տվյալ գործարքի բոլոր արգելափակումները:
Որոշ հրամանների հետ չի թույլատրվում օգտագործել ROLLBACK: Դրանց թվին են պատկանում տվյալների սահմանման լեզուն (Data Definition Language – DDL), որը ստեղծում, փոփոխում և ջնջում է տվյալների բազաներ ու աղյուսակներ: Պետք է գործարքները նախագծել այնպես, որ այդ հրամանները դրանց մեջ չլինեն և, եթե գործարքի սկզբում օգտագործել եք DDL հրամաններից որևէ մեկը, գործարքի լրիվ ազդեցությունը չի կարող չեղարկվել ROLLBACK օպերատորով:
MySQL 4.0.14 և 4.1.1 տարբերակներում innoDB աղյուսակները աջակցում են SAVEPOINT և ROLLBACK TO SAVEPOINT օպերատորները.
SAVEPOINT my_save_point; ROLLBACK TO SAVEPOINT my_save_point;
SAVEPOINT օպերատորով ստեղծում ենք «my_save_point» անունով պահպանման կետ: ROLLBACK TO SAVEPOINT օպերատորը գործարքն ուղղորդում է դեպի տրված անունով պահպանման կետ: Եթե տվյալ գործարքն արդեն ունի նման անունով պահպանման կետ, ապա նախորդը ջնջվում է և պահպանվում է նորը: Գործարքի բոլոր պահպանման կետերը ջնջվում են, եթե ROLLBACK կամ COMMIT օպերատորներն օգտագործվում են առանց պահպանման կետի անունի: Եթե օպերատորը վերադարձնում է «ERROR 1181: Got error 153 during ROLLBACK» սխալը, ապա նշանակում է, որ տվյալ անունով պահպանման կետ գոյություն չունի: ROLLBACK-ի աշխատանքը դիտարկենք օրինակով:
UPDATE products SET price=50 WHERE product_id = 110; SAVEPOINT save_point; UPDATE product_quantity SET pr_price=50 WHERE pr_id = 110; ROLLBACK TO SAVEPOINT save_point; COMMIT;
Այս օրինակում «products» աղյուսակում կատարվում է թարմացում, որից հետո ստեղծվել է պահպանման կետ «save_point» անունով: Կատարվում է նաև «product_quantity» աղյուսակի թարմացում: ROLLBACK կկատարվի դեպի «save_point» պահպանման կետ, եթե օպերատորի կատարումը ինչ-որ պատճառով ձախողվի կամ, եթե օգտագործողը չեղյալ համարի այն CTRL + C հրամանով: ROLLBACK-ի ժամանակ SAVEPOINT -ից հետո կատարված գործողությունները հաջորդաբար կչեղարկվեն, իսկ դրանից վերև կատարվածները՝ կմնան անփոփոխ: Այսինքն՝ «product_quantity» աղյուսակում կատարված թարմացումը կչեղարկվի, իսկ «products» աղյուսակի փոփոխությունը կմնա անփոփոխ:
Որևէ հարցի դեպքում կարող եք դիմել մեզ մեկնաբանությունների կամ քննարկումների բաժիններում։