Վերականգնել բեռնումը SQL Server-ից Oracle VPN-ի անջատվելուց հետո
Անջատված VPN-ը կանչողին թողնում է անորոշության մեջ՝ ավարտվե՞լ է արդյոք commit-ը Oracle-ում։ Տևական խմբաքանակի ID-ն թույլ է տալիս հերթով պատասխանել արտահանմանը, կիրառմանը և հաշտեցմանը։
Տվյալների բազաների միջև փոխանցումը մահանում է, երբ VPN-ն անջատվում է, և «նորից գործարկիր»-ը վերականգնման պլան չէ։ Աղբյուրի արտահանումը կարող է ավարտված լինել, նպատակակետը կարող է արդեն commit արած լինել, կամ պատասխանը պարզապես կորել է հետդարձի ճանապարհին։ Այս երեք վիճակները տարբեր գործողություններ են պահանջում, և միայն «սխալ» իմացող հաճախորդը չի կարող տարբերել դրանք։
Լուծումը ճարտարապետական է. յուրաքանչյուր գործարկման տվեք տևական խմբաքանակային ինքնություն, և թող տվյալների բազաները պատասխանեն հարցերին՝ փոխարենը թույլ չտալով հաճախորդին գուշակել։
Ինչ է իրականում երաշխավորում տվյալների բազան
SQL Server-ը և Oracle-ը երկուսն էլ ապահովում են ատոմականություն գործարքի ներսում։ Նրանցից ոչ մեկը ձեզ ատոմականություն չի տալիս երկուսի միջև։ Կորցված կապը չի վնասում տվյալների բազան և չի հարկադրում ձեռքով հետգլորում, քանի որ սերվերն ինքն է լուծում իր գործարքը՝ առանց ձեզ։ Այն, ինչ կոտրվում է, կանչողի գիտելիքն է արդյունքի մասին։
Առանձին commit արված նշանակում է առանձին commit արված։ Երկու կապերն էլ կրող VPN-ը երկու commit չի միաձուլում մեկ աշխատանքային միավորի մեջ։
Այն commit-ը, որի մասին երբեք չեք լսել
Մեկ ձախողման եղանակ պատժում է միամիտ կրկնափորձի տրամաբանությունը. սերվերը commit է անում, և հաստատումը երբեք չի հասնում կանչողին։ Oracle-ը դա փաստագրում է որպես անհայտ արդյունքի խնդիր և դրա համար տրամադրում է Transaction Guard գործարքների փաստաթղթերում։ Հաղորդակցության սխալը ապացույց չէ, որ ուղարկված commit-ը ձախողվել է, և այն որպես ապացույց դիտարկելը հենց այն ճանապարհն է, որով խմբաքանակը երկու անգամ տեղադրվում է։ Տարբերությունը ամենակարևորն է կրկնափորձի ուղու վրա, որտեղ օպերատորն ունի սխալի հաղորդագրություն և գործելու այլ ազդանշան չունի։
Ուստի վերականգնման քայլը պետք է արդյունքը կարդա նպատակակետից, այլ ոչ թե այն եզրակացնի սխալի տեքստից։
Փոխանցմանը տվեք խմբաքանակային ինքնություն
Յուրաքանչյուր գործարկում ստանում է անփոփոխ խմբաքանակի ID, և նպատակակետը գրանցում է, թե ինչ արեց այդ ID-ով։ Կյանքի ցիկլը չորս քայլ է, և այն նույն տեսքն ունի անկախ մատակարարից.
- Արտահանեք նույնականացված, անփոփոխ աղբյուրի խմբաքանակ՝ գրանցված սխեմայով և սահմանով։
- Փոխանցեք այն նպատակակետի նախապատրաստման տարածք և հայտնաբերեք թերի կամ հակասական բովանդակությունը նախքան պատրաստ հայտարարելը։
- Կիրառեք այն նպատակակետի սեփական եզակիության կամ կողպման կանոններով և գրանցեք ավարտը նույն տեղական գործարքում։
- Հաշտեցրեք տևական արդյունքը աջակցվող արձանագրության միջոցով նախքան հաստատումը կամ կրկնափորձը։
Կրկնափորձերը վերաօգտագործում են նույն ID-ն։ Յուրաքանչյուր փորձի համար նոր ID-ն քանդում է հենց նոր կառուցած կրկնօրինակների կանխարգելումը, ինչը ակնհայտ է թվում, քանի դեռ կրկնափորձի փաթաթան ինքնաբերաբար մեկը չի ստեղծում։
ID-ն նաև ձեզ տալիս է ինչ-որ բան, որի հետ ավելի ուշ հաշտեցնեք, շատ ժամանակ անց այն բանից հետո, երբ հաճախորդի գործընթացը վաղուց անհետացել է։
Զբաղեցրեք խմբաքանակը, ապա կիրառեք
Կիրառման քայլը պետք է զբաղեցնի խմբաքանակի ID-ն, կատարի բիզնես փոփոխությունները և գրանցի ավարտը մեկ տեղական գործարքում։ Ստուգումն ու ներդրումը որպես առանձին հայտարարություններ կատարելը վերադարձնում է այն մրցավազքը, որը փորձում էիք հեռացնել։ Եթե երկու աշխատող մրցում են, ճիշտ մեկ զբաղեցում է հաղթում, և մյուսին դա հայտնում են։
Ավարտի գրառման բացակայությունը ապացույց չէ, որ ընթացքի մեջ գտնվող գործարքը երբեք commit չի անի։ Զբաղեցումը պետք է հաջորդականացնի մրցակից փորձերը, կամ արձանագրությունը պետք է կարդա տևական արդյունքը նախքան որևէ որոշում։
Այդ հաջորդականացման համար օգտագործեք տվյալների բազայի աջակցվող մեխանիզմը՝ հավելվածի կոդում ստուգիր-և-կրկնիր ցիկլի փոխարեն։
Ինչ դեռ չի կարող խոստանալ դիզայնը
Նախապատրաստումը աշխատանքը դարձնում է վերսկսելի և նվազեցնում է կախվածությունը մեկ երկարատև սեսիայից։ Այն չի ստեղծում մեկ ատոմական commit SQL Server-ի, Oracle-ի և ցանկացած արտաքին կողմնակի ազդեցության վրա, որն աշխատանքը կատարում է։ Եթե բիզնեսն իսկապես դրա կարիքն ունի, նախագծեք և որակավորեք աջակցվող բաշխված գործարք կամ հաշտեցման գործընթաց, ներառյալ, թե ումն է անորոշ արդյունքով աշխատանքը։ Ավելի թույլ ամեն ինչ տեղ ունի հաշտեցման ուղեցույցում, ոչ թե փոխանցման կոդում։
Ընդունեք ընդհատումը երեք տեղում՝ փոխանցման ընթացքում, կիրառման ընթացքում, և commit-ից հետո, բայց հաստատումից առաջ։ Այնուհետև ստուգեք բիզնես արդյունքը, այլ ոչ հաճախորդի հաղորդագրությունը, և թող խմբաքանակի մատյանը ասի՝ աշխատանքը թերի է, commit արված, թե դեռ չլուծված։