Գործարքները և դրանց վերահսկման մեխանիզմները

Գործարքի

Գործարքը տվյալների վրա կատարված գործողությունների հաջորդականությունն է, որն ունի սկիզբ և ավարտ:

Գործարքը կարդալու և գրելու գործողությունների հաջորդական կատարումն է: Գործարքի ավարտը կարող է լինել կամ պահպանել փոփոխությունները (կատարել) կամ չեղարկել փոփոխությունները (վերադարձ): Տվյալների բազայի հետ կապված գործարքը բաղկացած է մի քանի հարցումներից, որոնք դիտարկվում են որպես մեկ հարցում:

Գործարքները պետք է բավարարեն ACID հատկությունները

Ատոմականություն. Գործարքը կամ ամբողջությամբ ավարտված է, կամ ընդհանրապես չի ավարտվել:

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

Մեկուսացում. Զուգահեռաբար կատարվող գործարքները չպետք է ազդեն միմյանց վրա, օրինակ՝ փոխեն մեկ այլ գործարքի կողմից օգտագործվող տվյալները: Զուգահեռ գործարքների կատարման արդյունքը պետք է լինի նույնը, ինչ եթե գործարքները կատարվեին հաջորդաբար:

Կայունություն. Կատարվելուց հետո փոփոխությունները չպետք է կորչեն:

Գործարքների մատյան

Գրանցամատյանը պահպանում է գործարքների արդյունքում կատարված փոփոխությունները, ապահովում է տվյալների ատոմականությունն ու կայունությունը համակարգի խափանման դեպքում

Գրանցամատյանը պարունակում է այն արժեքները, որոնք ունեին տվյալները գործարքի արդյունքում փոխվելուց առաջ և հետո: Գրանցման նախնական ռազմավարությունը պահանջում է մուտքագրել գրանցամատյան նախորդ արժեքների մասին նախքան մեկնարկը, և վերջնական արժեքների մասին՝ գործարքի ավարտից հետո: Համակարգի հանկարծակի դադարեցման դեպքում տվյալների բազան հակառակ հերթականությամբ կարդում է գրանցամատյանը և չեղարկում գործարքների միջոցով կատարված փոփոխությունները: Հանդիպելով ընդհատված գործարքի, տվյալների բազան կատարում է այն և դրա մասին փոփոխություններ է կատարում գրանցամատյանում: Խափանման պահին լինելով վիճակի մեջ՝ տվյալների բազան կարդում է գրանցամատյանը առաջընթաց կարգով և վերադարձնում գործարքների արդյունքում կատարված փոփոխությունները: Այսպիսով, պահպանվում է արդեն իսկ կատարված գործարքների կայունությունը և ընդհատված գործարքի ատոմականությունը։

Վերականգնման համար պարզապես ձախողված գործարքների կրկնակի կատարումը բավարար չէ:

Օրինակ. Օգտագործողի հաշվին կա 500 դոլար, և օգտատերը որոշում է այն հանել բանկոմատից: Ընթացքի մեջ է երկու գործարք: Առաջինը կարդում է մնացորդի արժեքը, և եթե մնացորդի վրա բավականաչափ միջոցներ կան, ապա օգտատիրոջը գումար է տալիս: Երկրորդը մնացորդից հանում է պահանջվող գումարը: Ենթադրենք, համակարգը խափանվեց, և առաջին գործողությունը ձախողվեց, բայց երկրորդը խափանվեց: Այս դեպքում մենք չենք կարող կրկին գումար տրամադրել օգտատիրոջը՝ առանց համակարգը վերադարձնելու իր սկզբնական վիճակին՝ դրական մնացորդով:

Մեկուսացման մակարդակները

Կարդացեք պարտավորված

Dirty Read-ի խնդիրն այն է, որ գործարքը կարող է կարդալ մեկ այլ գործարքի միջանկյալ արդյունքը:

Օրինակ. Հաշվեկշռի սկզբնական արժեքը $0 է: T1-ը ձեր հաշվեկշռին ավելացնում է $50: T2-ը կարդում է մնացորդի արժեքը ($50): T1-ը հրաժարվում է փոփոխություններից և դուրս է գալիս: T2-ը շարունակում է աշխատանքը սխալ հաշվեկշռի տվյալներով:

Լուծումը ֆիքսված տվյալների ընթերցումն է (Read Committed), որն արգելում է կարդալ գործարքով փոխված տվյալները: Եթե ​​գործարք Ա-ն փոխել է տվյալների որոշակի հավաքածու, ապա B գործարքը, երբ մուտք է գործում այս տվյալներ, ստիպված է սպասել գործարքի A-ի ավարտին:

Կրկնվող ընթերցում

Կորցրած թարմացումների խնդիր: T1-ը պահպանում է փոփոխությունները T2-ի փոփոխությունների վրա:

Օրինակ. Հաշվեկշռի սկզբնական արժեքը $0 է, և երկու գործարք միաժամանակ լրացնում են մնացորդը: T1-ը և T2-ը կարդացել են $0 մնացորդ: T2-ն այնուհետև ավելացնում է $200 $0-ին և պահպանում է արդյունքը: T1-ը ավելացնում է $100-ը $0-ին և պահպանում է արդյունքը: Վերջնական արդյունքը $100 է $300-ի փոխարեն։

Անկրկնելի ընթերցման խնդիր: Միևնույն տվյալների բազմիցս կարդալը տարբեր արժեքներ է տալիս:

Օրինակ. T1-ը կարդում է $0 մնացորդի արժեքը: T2-ն այնուհետև ավելացնում է $50 մնացորդին և ավարտում: T1-ը կրկին կարդում է տվյալները և անհամապատասխանություն է գտնում նախորդ արդյունքի հետ:

Կրկնվող ընթերցումը երաշխավորում է, որ երկրորդ ընթերցումը կվերադարձնի նույն արդյունքը: Մեկ գործարքի կողմից կարդացված տվյալները չեն կարող փոխվել մյուսներում, քանի դեռ գործարքը չի ավարտվել: Եթե ​​գործարքը A-ն կարդացել է տվյալների որոշակի փաթեթ, ապա B գործարքը, երբ մուտք է գործում այս տվյալներ, ստիպված է սպասել գործարքի A-ի ավարտին:

Պատվիրված ընթերցում (Սերիալիզացվող)

Phantom Reads-ի խնդիր: Երկու հարցումներ, որոնք տվյալներ են ընտրում որոշակի պայմանի հիման վրա, վերադարձնում են տարբեր արժեքներ:

Օրինակ. T1-ը պահանջում է բոլոր օգտատերերի թիվը, որոնց մնացորդը $0-ից մեծ է, բայց 100$-ից պակաս: T2-ը $1 է հանում $101 մնացորդ ունեցող օգտվողից: T1-ը վերաթողարկում է հարցումը:

Պատվիրված ընթերցում (Serializable): Գործարքները կատարվում են ամբողջությամբ հաջորդականությամբ: Արգելվում է թարմացնել կամ ավելացնել գրառումները, որոնք համապատասխանում են հարցումի պայմաններին: Եթե ​​գործարքը A-ն պահանջել է տվյալներ ամբողջ աղյուսակից, ապա ամբողջ աղյուսակը սառեցվում է այլ գործարքների համար, մինչև A գործարքի ավարտը:

Ժամանակացույց

Սահմանում է գործողությունների հաջորդականությունը զուգահեռ գործարքների ժամանակ:

Ապահովում է մեկուսացման որոշակի մակարդակ: Եթե ​​գործողությունների արդյունքը կախված չէ դրանց հերթականությունից, ապա այդպիսի գործողությունները փոխադարձ են (Permutable): Ընթերցանության գործողությունները և տարբեր տվյալների վրա գործող գործողությունները փոխադարձ են: Կարդալ-գրել և գրել-գրել գործողությունները փոխադարձ չեն: Ժամանակացույցի խնդիրն է միահյուսել զուգահեռ գործարքներով կատարված գործողությունները, որպեսզի կատարման արդյունքը համարժեք լինի գործարքների հաջորդական կատարմանը:

Զուգահեռ աշխատատեղերի վերահսկման մեխանիզմներ (Concurrency Control)

Լավատեսությունը հիմնված է հակամարտությունների հայտնաբերման և լուծման վրա, հոռետեսությունը հիմնված է հակամարտությունների առաջացման կանխարգելման վրա:

Լավատեսական մոտեցման դեպքում բազմաթիվ օգտվողներ իրենց տրամադրության տակ ունեն տվյալների պատճեններ: Առաջինը, ով ավարտում է խմբագրումը, պահպանում է փոփոխությունները, մինչդեռ մյուսները պետք է միաձուլեն փոփոխությունները: Լավատեսական ալգորիթմը թույլ է տալիս կոնֆլիկտ առաջանալ, սակայն համակարգը պետք է վերականգնվի հակամարտությունից:

Հոռետեսական մոտեցմամբ, առաջին օգտվողը, ով հավաքում է տվյալները, խանգարում է ուրիշներին ստանալ տվյալներ: Եթե ​​հակամարտությունները հազվադեպ են լինում, խելամիտ է ընտրել լավատեսական ռազմավարությունը, քանի որ այն ապահովում է համաժամանակության ավելի բարձր մակարդակ:

Կողպում

Եթե ​​որևէ գործարք ունի կողպված տվյալներ, ապա մյուս գործարքները պետք է սպասեն, մինչև այն ապակողպվի տվյալների մուտք գործելիս:

Բլոկը կարող է ծածկվել տվյալների բազայի, աղյուսակի, տողի կամ հատկանիշի վրա: Համօգտագործվող կողպեքը կարող է դրվել նույն տվյալների վրա մի քանի գործարքների միջոցով, թույլ է տալիս կարդալ բոլոր գործարքները (ներառյալ այն, որը պարտադրել է), արգելում է փոփոխումը և բացառիկ գրավումը: Exclusive Lock-ը կարող է սահմանվել միայն մեկ գործարքի միջոցով, թույլ է տալիս պարտադրվող գործարքի ցանկացած գործողություն, արգելում է ուրիշների ցանկացած գործողություն:

Փակուղին մի իրավիճակ է, երբ գործարքները հայտնվում են անորոշ վիճակում, որը տևում է անորոշ ժամանակով:

Օրինակ. Առաջին գործարքը սպասում է, որ երկրորդի կողմից հավաքագրված տվյալները հրապարակվեն, մինչդեռ երկրորդը սպասում է առաջինի կողմից հավաքագրված տվյալների հրապարակմանը:

Փակուղու խնդրի լավատեսական լուծումը թույլ է տալիս փակուղի առաջանալ, բայց հետո վերականգնում է համակարգը՝ հետ գլորելով փակուղում ներգրավված գործարքներից մեկը:

Փակուղիները որոնվում են որոշակի պարբերականությամբ: Հայտնաբերման մեթոդներից մեկը ժամանակի միջոցով է, այսինքն՝ համարեք, որ փակուղի է առաջացել, եթե գործարքի ավարտը չափազանց երկար է տևում: Երբ հայտնաբերվում է փակուղի, գործարքներից մեկը հետ է մղվում՝ թույլ տալով փակուղում ներգրավված մյուս գործարքներն ավարտին հասցնել: Տուժողի ընտրությունը կարող է հիմնված լինել գործարքների արժեքի կամ դրանց ստաժի վրա (Wait-Die և Wound-wait սխեմաներ):

Յուրաքանչյուր գործարք T նշանակվում է ժամանակի նշան TS որը պարունակում է գործարքի մեկնարկի ժամը.

Սպասեք-Մեռնեք:

Եթե TS (Ti) < TS (Tj), Հետո Ti սպասում է, հակառակ դեպքում Ti հետ է գլորվում և նորից սկսում նույն ժամանակի նշանով:

Եթե ​​երիտասարդ գործարքը ձեռք է բերել ռեսուրս, իսկ ավելի հին գործարքը պահանջում է նույն ռեսուրսը, ապա ավելի հին գործարքին թույլատրվում է սպասել: Եթե ​​ավելի հին գործարքը ձեռք է բերել ռեսուրս, ապա այդ ռեսուրսը պահանջող ավելի երիտասարդ գործարքը հետ կվերցվի:

Վերք-սպասում.

Եթե TS (Ti) < TS (Tj), Հետո Tj հետ է գլորվում և նորից սկսում նույն ժամադրոշմով, հակառակ դեպքում Ti սպասում.

Եթե ​​ավելի երիտասարդ գործարքը ձեռք է բերել ռեսուրս, իսկ ավելի հին գործարքը պահանջում է նույն ռեսուրսը, ապա ավելի երիտասարդ գործարքը հետ կվերցվի: Եթե ​​ավելի հին գործարքը ձեռք է բերել ռեսուրս, ապա այդ ռեսուրսը պահանջող ավելի երիտասարդ գործարքին թույլատրվում է սպասել: Նախադասության վրա հիմնված զոհի ընտրությունը կանխում է փակուղիները, բայց հետ է մղում այն ​​գործարքները, որոնք փակուղում չեն: Խնդիրն այն է, որ գործարքները կարող են բազմիցս հետ վերադարձվել, քանի որ... ավելի հին գործարքը կարող է երկար ժամանակ պահել ռեսուրսը:

Փակուղու խնդրի հոռետեսական լուծումը թույլ չի տալիս գործարքը սկսել իրականացնել, եթե առկա է փակուղու վտանգ:

Փակուղի հայտնաբերելու համար կառուցվում է գրաֆիկ (սպասման գրաֆիկ, սպասման գրաֆիկ), որի գագաթները գործարքներ են, իսկ ծայրերը ուղղվում են տվյալների հրապարակմանը սպասող գործարքներից դեպի այն գործարքը, որը գրավել է այս տվյալները: Փակուղի է համարվում, եթե գրաֆիկն ունի օղակ: Սպասման գրաֆիկ կառուցելը, հատկապես բաշխված տվյալների բազաներում, թանկ ընթացակարգ է:

Երկփուլ կողպում - կանխում է փակուղիները՝ գործարքի սկզբում գործարքի կողմից օգտագործվող բոլոր ռեսուրսները բռնագրավելով և վերջում դրանք բաց թողնելով։

Բոլոր արգելափակման գործողությունները պետք է նախորդեն առաջին ապակողպմանը: Այն ունի երկու փուլ՝ աճող փուլ, որի ընթացքում բռնակները կուտակվում են, և նեղացման փուլ, որի ընթացքում բռնակներն ազատվում են: Եթե ​​անհնար է գրավել ռեսուրսներից մեկը, գործարքը սկսվում է նորից: Հնարավոր է, որ գործարքը չկարողանա ձեռք բերել անհրաժեշտ ռեսուրսներ, օրինակ, եթե մի քանի գործարքներ մրցակցեն նույն ռեսուրսների համար:

Երկփուլային կատարումը ապահովում է, որ commit-ը կատարվում է տվյալների բազայի բոլոր կրկնօրինակների վրա

Յուրաքանչյուր շտեմարան մուտքագրում է տեղեկամատյանում փոխվող տվյալների մասին տեղեկատվություն և պատասխանում է OK համակարգողին (քվեարկության փուլ): Այն բանից հետո, երբ բոլորը լավ են պատասխանել, համակարգողը ազդանշան է ուղարկում, որը պարտավորեցնում է բոլորին պարտավորվել: Կատարելուց հետո սերվերները պատասխանում են OK, եթե գոնե մեկը լավ չի արձագանքում, ապա համակարգողը ազդանշան է ուղարկում բոլոր սերվերներին փոփոխությունները չեղարկելու համար (Ավարտման փուլ):

Ժամացույցի մեթոդ

Ավելի հին գործարքը հետ է մղվում, երբ փորձում են մուտք գործել ավելի երիտասարդ գործարքի հետ կապված տվյալներ

Յուրաքանչյուր գործարքի նշանակվում է ժամանակի նշան TS կատարման մեկնարկի ժամանակին համապատասխան: Եթե Ti ավարտվել է Tj, Հետո TS (Ti) < TS (Tj).

Երբ գործարքը հետ է վերադարձվում, դրան նշանակվում է նոր ժամանակի նշան: Յուրաքանչյուր տվյալների օբյեկտ Q գործարքի մեջ ներգրավված է երկու պիտակով. W-TS (Q) — ամենաերիտասարդ գործարքի ժամանակացույցը, որը հաջողությամբ ավարտեց ռեկորդը Q. R-TS (Q) — ամենաերիտասարդ գործարքի ժամանակի դրոշմը, որի վրա կատարվել է ընթերցման գրառում Q.

Երբ գործարքը T տվյալների ընթերցման հարցումներ Q Երկու տարբերակ կա.

Եթե TS (T) < W-TS (Q), այսինքն՝ տվյալները թարմացվել են ավելի երիտասարդ գործարքով, ապա՝ գործարքով T հետ է գլորվում.

Եթե TS (T) >= W-TS (Q), ապա ընթերցումը կատարվում է եւ R-TS (Q) դառնում է դառնում MAX (R-TS (Q), TS (T)).

Երբ գործարքը T պահանջում է տվյալների փոփոխություններ Q Երկու տարբերակ կա.

Եթե TS (T) < R-TS (Q), այսինքն՝ տվյալներն արդեն կարդացվել են ավելի երիտասարդ գործարքի կողմից և եթե փոփոխություն կատարվի, կոնֆլիկտ կառաջանա։ Գործարք T հետ է գլորվում.

Եթե TS (T) < W-TS (Q), այսինքն՝ գործարքը փորձում է վերագրանցել ավելի նոր արժեք, T գործարքը հետ է գլորվում։ Այլ դեպքերում փոփոխությունը կատարվում է և W-TS (Q) դառնում է հավասար TS (T).

Ոչ մի թանկարժեք սպասման գրաֆիկի կառուցում չի պահանջվում: Ավելի հին գործարքները կախված են նորերից, ուստի սպասման գրաֆիկում ցիկլեր չկան: Փակուղիներ չկան, քանի որ գործարքները չեն սպասվում, այլ անմիջապես հետ են գլորվում: Հնարավոր են կասկադային հետադարձումներ: Եթե Ti գլորվեց և Tj Ես կարդացի այն տվյալները, որոնք ես փոխել եմ Ti, Հետո Tj պետք է նաև հետ գլորվի: Եթե ​​միաժամանակ Tj արդեն կատարվել է, ապա կլինի կայունության սկզբունքի խախտում։

Կասկադային վերադարձի լուծումներից մեկը: Գործարքը վերջում ավարտում է գրելու բոլոր գործողությունները, և մյուս գործարքները պետք է սպասեն այդ գործողության ավարտին: Գործարքները սպասում են, որ կատարվեն նախքան կարդալը:

Թոմասի գրելու կանոնը՝ ժամանակի դրոշմակնիքի մեթոդի փոփոխություն, որի դեպքում ավելի երիտասարդ գործարքի կողմից թարմացված տվյալները արգելվում են ավելի հին գործարքի կողմից վերագրանցվել։

Գործարք T պահանջում է տվյալների փոփոխություններ Q. Եթե TS (T) < W-TS (Q), այսինքն՝ գործարքը փորձում է վերագրանցել ավելի նոր արժեք, T գործարքը հետ չի գլորվում, ինչպես ժամանակի դրոշման մեթոդում։

Source: www.habr.com

Добавить комментарий