Տվյալների բազաների միջև փոխանցումը մահանում է, երբ VPN-ն անջատվում է, և «նորից գործարկիր»-ը վերականգնման պլան չէ։ Աղբյուրի արտահանումը կարող է ավարտված լինել, նպատակակետը կարող է արդեն commit արած լինել, կամ պատասխանը պարզապես կորել է հետդարձի ճանապարհին։ Այս երեք վիճակները տարբեր գործողություններ են պահանջում, և միայն «սխալ» իմացող հաճախորդը չի կարող տարբերել դրանք։

Լուծումը ճարտարապետական է. յուրաքանչյուր գործարկման տվեք տևական խմբաքանակային ինքնություն, և թող տվյալների բազաները պատասխանեն հարցերին՝ փոխարենը թույլ չտալով հաճախորդին գուշակել։

Ինչ է իրականում երաշխավորում տվյալների բազան

SQL Server-ը և Oracle-ը երկուսն էլ ապահովում են ատոմականություն գործարքի ներսում։ Նրանցից ոչ մեկը ձեզ ատոմականություն չի տալիս երկուսի միջև։ Կորցված կապը չի վնասում տվյալների բազան և չի հարկադրում ձեռքով հետգլորում, քանի որ սերվերն ինքն է լուծում իր գործարքը՝ առանց ձեզ։ Այն, ինչ կոտրվում է, կանչողի գիտելիքն է արդյունքի մասին։

Առանձին commit արված նշանակում է առանձին commit արված։ Երկու կապերն էլ կրող VPN-ը երկու commit չի միաձուլում մեկ աշխատանքային միավորի մեջ։

Այն commit-ը, որի մասին երբեք չեք լսել

Մեկ ձախողման եղանակ պատժում է միամիտ կրկնափորձի տրամաբանությունը. սերվերը commit է անում, և հաստատումը երբեք չի հասնում կանչողին։ Oracle-ը դա փաստագրում է որպես անհայտ արդյունքի խնդիր և դրա համար տրամադրում է Transaction Guard գործարքների փաստաթղթերում։ Հաղորդակցության սխալը ապացույց չէ, որ ուղարկված commit-ը ձախողվել է, և այն որպես ապացույց դիտարկելը հենց այն ճանապարհն է, որով խմբաքանակը երկու անգամ տեղադրվում է։ Տարբերությունը ամենակարևորն է կրկնափորձի ուղու վրա, որտեղ օպերատորն ունի սխալի հաղորդագրություն և գործելու այլ ազդանշան չունի։

Ուստի վերականգնման քայլը պետք է արդյունքը կարդա նպատակակետից, այլ ոչ թե այն եզրակացնի սխալի տեքստից։

Փոխանցմանը տվեք խմբաքանակային ինքնություն

Յուրաքանչյուր գործարկում ստանում է անփոփոխ խմբաքանակի ID, և նպատակակետը գրանցում է, թե ինչ արեց այդ ID-ով։ Կյանքի ցիկլը չորս քայլ է, և այն նույն տեսքն ունի անկախ մատակարարից.

  1. Արտահանեք նույնականացված, անփոփոխ աղբյուրի խմբաքանակ՝ գրանցված սխեմայով և սահմանով։
  2. Փոխանցեք այն նպատակակետի նախապատրաստման տարածք և հայտնաբերեք թերի կամ հակասական բովանդակությունը նախքան պատրաստ հայտարարելը։
  3. Կիրառեք այն նպատակակետի սեփական եզակիության կամ կողպման կանոններով և գրանցեք ավարտը նույն տեղական գործարքում։
  4. Հաշտեցրեք տևական արդյունքը աջակցվող արձանագրության միջոցով նախքան հաստատումը կամ կրկնափորձը։

Կրկնափորձերը վերաօգտագործում են նույն ID-ն։ Յուրաքանչյուր փորձի համար նոր ID-ն քանդում է հենց նոր կառուցած կրկնօրինակների կանխարգելումը, ինչը ակնհայտ է թվում, քանի դեռ կրկնափորձի փաթաթան ինքնաբերաբար մեկը չի ստեղծում։

ID-ն նաև ձեզ տալիս է ինչ-որ բան, որի հետ ավելի ուշ հաշտեցնեք, շատ ժամանակ անց այն բանից հետո, երբ հաճախորդի գործընթացը վաղուց անհետացել է։

Զբաղեցրեք խմբաքանակը, ապա կիրառեք

Կիրառման քայլը պետք է զբաղեցնի խմբաքանակի ID-ն, կատարի բիզնես փոփոխությունները և գրանցի ավարտը մեկ տեղական գործարքում։ Ստուգումն ու ներդրումը որպես առանձին հայտարարություններ կատարելը վերադարձնում է այն մրցավազքը, որը փորձում էիք հեռացնել։ Եթե երկու աշխատող մրցում են, ճիշտ մեկ զբաղեցում է հաղթում, և մյուսին դա հայտնում են։

Ավարտի գրառման բացակայությունը ապացույց չէ, որ ընթացքի մեջ գտնվող գործարքը երբեք commit չի անի։ Զբաղեցումը պետք է հաջորդականացնի մրցակից փորձերը, կամ արձանագրությունը պետք է կարդա տևական արդյունքը նախքան որևէ որոշում։

Այդ հաջորդականացման համար օգտագործեք տվյալների բազայի աջակցվող մեխանիզմը՝ հավելվածի կոդում ստուգիր-և-կրկնիր ցիկլի փոխարեն։

Ինչ դեռ չի կարող խոստանալ դիզայնը

Նախապատրաստումը աշխատանքը դարձնում է վերսկսելի և նվազեցնում է կախվածությունը մեկ երկարատև սեսիայից։ Այն չի ստեղծում մեկ ատոմական commit SQL Server-ի, Oracle-ի և ցանկացած արտաքին կողմնակի ազդեցության վրա, որն աշխատանքը կատարում է։ Եթե բիզնեսն իսկապես դրա կարիքն ունի, նախագծեք և որակավորեք աջակցվող բաշխված գործարք կամ հաշտեցման գործընթաց, ներառյալ, թե ումն է անորոշ արդյունքով աշխատանքը։ Ավելի թույլ ամեն ինչ տեղ ունի հաշտեցման ուղեցույցում, ոչ թե փոխանցման կոդում։

Ընդունեք ընդհատումը երեք տեղում՝ փոխանցման ընթացքում, կիրառման ընթացքում, և commit-ից հետո, բայց հաստատումից առաջ։ Այնուհետև ստուգեք բիզնես արդյունքը, այլ ոչ հաճախորդի հաղորդագրությունը, և թող խմբաքանակի մատյանը ասի՝ աշխատանքը թերի է, commit արված, թե դեռ չլուծված։

Առնչվող հոդվածներ