Мәмілелер және оларды басқару механизмдері

Мәмілелер

Транзакция – бұл басы мен соңы бар деректермен орындалатын операциялар тізбегі.

Транзакция – оқу және жазу операцияларының ретімен орындалуы. Транзакцияның соңы өзгерістерді сақтау (міндеттеу) немесе өзгертулерден бас тарту (қайтару) болуы мүмкін. Мәліметтер қорына қатысты транзакция бір сұраныс ретінде қарастырылатын бірнеше сұраулардан тұрады.

Транзакциялар ACID қасиеттерін қанағаттандыруы керек

Атомдық. Мәміле толығымен аяқталды немесе мүлде аяқталмайды.

Жүйелілік. Транзакцияны аяқтаған кезде деректерге қойылған шектеулер (мысалы, деректер базасындағы шектеулер) бұзылмауы керек. Жүйелілік жүйенің бір дұрыс күйден екінші дұрыс күйге ауысатынын білдіреді.

Оқшаулау. Параллель орындалатын транзакциялар бір-біріне әсер етпеуі керек, мысалы, басқа транзакция пайдаланатын деректерді өзгерту. Параллельді операцияларды орындаудың нәтижесі транзакциялар ретімен орындалғандай болуы керек.

Тұрақтылық. Жасалғаннан кейін өзгертулер жоғалмауы керек.

Транзакция журналы

Журнал транзакциялар жасаған өзгерістерді сақтайды, жүйе ақаулығы жағдайында деректердің атомдылығы мен тұрақтылығын қамтамасыз етеді

Журналда деректер транзакция арқылы өзгертілгенге дейін және кейін болған мәндерді қамтиды. Алдын ала жазу журналының стратегиясы басталғанға дейін алдыңғы мәндер туралы және транзакция аяқталғаннан кейін соңғы мәндер туралы журнал жазбасын қосуды талап етеді. Жүйе кенеттен тоқтаған жағдайда, деректер базасы журналды кері ретпен оқиды және транзакциялармен енгізілген өзгерістерді жояды. Үзілген транзакцияға тап болған дерекқор оны орындайды және ол туралы журналға өзгерістер енгізеді. Сәтсіздік кезінде күйде бола отырып, дерекқор журналды алға қарай оқиды және транзакциялар жасаған өзгерістерді қайтарады. Осылайша, бұрыннан жасалған транзакциялардың тұрақтылығы және үзілген транзакцияның атомдылығы сақталады.

Қалпына келтіру үшін сәтсіз транзакцияларды жай ғана қайта орындау жеткіліксіз.

Мысал. Пайдаланушының шотында $500 бар және пайдаланушы оны банкоматтан алуды шешеді. Екі транзакция орындалуда. Біріншісі баланс құнын оқиды және баланста жеткілікті қаражат болса, ол пайдаланушыға ақша береді. Екіншісі баланстан қажетті соманы алып тастайды. Айталық, жүйе бұзылып, бірінші операция сәтсіз аяқталды, бірақ екіншісі істеді. Бұл жағдайда жүйені оң баланспен бастапқы күйіне қайтармай, пайдаланушыға ақшаны қайта шығара алмаймыз.

Оқшаулау деңгейлері

Міндетті түрде оқыңыз

Лас оқу мәселесі транзакция басқа транзакцияның аралық нәтижесін оқи алады.

Мысал. Баланстың бастапқы мәні $0. T1 балансыңызға $50 қосады. T2 баланс мәнін оқиды ($50). T1 өзгертулерді жоққа шығарады және шығады. T2 дұрыс емес баланс деректерімен орындауды жалғастырады.

Шешім транзакция арқылы өзгертілген деректерді оқуға тыйым салатын тіркелген деректерді оқу болып табылады (Read Committed). Егер А транзакциясы белгілі бір деректер жинағын өзгертсе, онда В транзакциясы осы деректерге қол жеткізген кезде А транзакциясының аяқталуын күтуге мәжбүр болады.

Қайталанатын оқу

Жоғалған жаңартулар мәселесі. T1 T2 өзгертулерінің үстіне өзгертулерді сақтайды.

Мысал. Баланстың бастапқы мәні $0 және екі транзакция бір уақытта балансты толтырады. T1 және T2 $0 балансын оқиды. Содан кейін T2 $200-ға $0 қосады және нәтижені сақтайды. T1 $100-ге $0 қосады және нәтижені сақтайды. Соңғы нәтиже 100 доллардың орнына 300 долларды құрайды.

Қайталанбайтын оқу мәселесі. Бірдей деректерді қайталап оқу әртүрлі мәндерді қайтарады.

Мысал. T1 $0 балансының мәнін оқиды. Содан кейін T2 балансқа $50 қосады және аяқталады. T1 деректерді қайта оқиды және алдыңғы нәтижемен сәйкессіздікті табады.

Қайталанатын оқу екінші оқудың бірдей нәтиже беретінін қамтамасыз етеді. Бір транзакция арқылы оқылған деректерді транзакция аяқталғанша басқаларында өзгерту мүмкін емес. Егер А транзакциясы белгілі бір деректер жинағын оқыған болса, онда В транзакциясы осы деректерге қол жеткізген кезде А транзакциясының аяқталуын күтуге мәжбүр болады.

Реттелген оқу (серияланатын)

Phantom Reads мәселесі. Белгілі бір шарт негізінде деректерді таңдайтын екі сұрау әртүрлі мәндерді қайтарады.

Мысал. T1 балансы $0-ден асатын, бірақ $100-ден аз барлық пайдаланушылардың санын сұрайды. T2 $1 балансы бар пайдаланушыдан $101 шегереді. T1 сұрауды қайта шығарады.

Реттелген оқу (серияланатын). Транзакциялар толығымен дәйекті түрде орындалады. Сұрау шарттарына сәйкес келетін жазбаларды жаңартуға немесе қосуға тыйым салынады. Егер А транзакциясы бүкіл кестеден деректерді сұраса, онда А транзакциясы аяқталғанша бүкіл кесте басқа транзакциялар үшін тоқтатылады.

Жоспарлаушы

Параллельді транзакциялар кезінде операциялардың орындалу ретін орнатады.

Белгіленген оқшаулау деңгейін қамтамасыз етеді. Егер амалдардың нәтижесі олардың ретіне тәуелді болмаса, онда мұндай амалдар коммутативті (пермутативті) болып табылады. Әртүрлі деректерге оқу әрекеттері мен амалдары коммутативті болып табылады. Оқу-жазу және жазу-жазу амалдары коммутативті емес. Жоспарлаушының міндеті - параллельді транзакциялармен орындалатын операцияларды орындау нәтижесі транзакциялардың дәйекті орындалуына эквивалентті болатындай етіп бөлу.

Параллель жұмыстарды басқару механизмдері (Concurrency Control)

Оптимизм қақтығыстарды анықтауға және шешуге негізделген, пессимистік қақтығыстардың туындауының алдын алуға негізделген.

Оптимистік тәсілде бірнеше пайдаланушының қолында деректердің көшірмелері болады. Өңдеуді аяқтаған бірінші адам өзгертулерді сақтайды, ал басқалары өзгертулерді біріктіруі керек. Оптимистік алгоритм қақтығыстың пайда болуына мүмкіндік береді, бірақ жүйе қақтығысты қалпына келтіруі керек.

Пессимистік көзқараспен деректерді бірінші түсірген пайдаланушы басқалардың деректерді алуына жол бермейді. Егер қақтығыстар сирек болса, оптимистік стратегияны таңдаған дұрыс, өйткені ол параллельділіктің жоғары деңгейін қамтамасыз етеді.

Құлыптау

Бір транзакцияда деректер құлыпталған болса, басқа транзакциялар деректерге қатынасу кезінде оның құлпы ашылғанша күтуі керек.

Блокты дерекқорға, кестеге, жолға немесе атрибутқа қоюға болады. Shared Lock бір деректерге бірнеше транзакциялар арқылы жүктелуі мүмкін, барлық транзакцияларды (соның ішінде оны енгізгенді) оқуға мүмкіндік береді, өзгертуге және эксклюзивті басып алуға тыйым салады. Эксклюзивті құлыптау тек бір транзакция арқылы енгізілуі мүмкін, жүктеп салу транзакциясының кез келген әрекетіне рұқсат береді, басқалардың кез келген әрекеттеріне тыйым салады.

Тығырыққа тірелу – транзакциялар белгісіз уақытқа созылатын күту күйінде аяқталатын жағдай.

Мысал. Бірінші транзакция екіншісі түсірген деректердің шығарылуын күтеді, ал екіншісі біріншісі түсірген деректердің шығарылуын күтеді.

Тұйықталу мәселесінің оптимистік шешімі тығырықтан шығуға мүмкіндік береді, бірақ содан кейін тығырықтан туындаған транзакциялардың бірін кері қайтару арқылы жүйені қалпына келтіреді.

Тұйықтаулар белгілі бір аралықтарда ізделеді. Анықтау әдістерінің бірі - уақыт бойынша, яғни транзакцияның аяқталуына тым ұзақ уақыт кетсе, тығырықтан шығу орын алды деп есептеңіз. Тығырықтау табылған кезде транзакциялардың бірі кері қайтарылады, бұл тығырықтан туындаған басқа транзакцияларды аяқтауға мүмкіндік береді. Жәбірленушіні таңдау транзакциялардың құнына немесе олардың еңбек өтіліне негізделуі мүмкін (Wait-Die және Wound-wait схемалары).

Әрбір транзакция T уақыт белгісі тағайындалады TS транзакцияның басталу уақытын қамтиды.

Күтіңіз, өліңіз.

егер TS(Ti) < TS(Tj)содан кейін Ti күтеді, әйтпесе Ti артқа оралады және сол уақыт белгісімен қайтадан басталады.

Егер жас транзакция ресурсты алса және ескі транзакция сол ресурсты сұраса, ескі транзакция күтуге рұқсат етіледі. Ескі транзакция ресурсты алған болса, сол ресурсты сұрайтын жас транзакция кері қайтарылады.

Жараны күт.

егер TS(Ti) < TS(Tj)содан кейін Tj кері оралады және сол уақыт белгісімен қайта басталады, әйтпесе Ti күту

Егер жас транзакция ресурсты алса және ескі транзакция сол ресурсты сұраса, кіші транзакция кері қайтарылады. Ескі транзакция ресурсты алған болса, сол ресурсты сұрайтын жас транзакция күтуге рұқсат етіледі. Артықшылыққа негізделген жәбірленушіні таңдау тығырықтан аулақ болады, бірақ тығырыққа тірелмеген транзакцияларды кері қайтарады. Мәселе мынада, транзакцияларды бірнеше рет кері қайтаруға болады, себебі... ескі транзакция ресурсты ұзақ уақыт бойы ұстауы мүмкін.

Тұйықталу мәселесінің пессимистік шешімі тұйыққа тірелу қаупі бар болса, транзакцияны орындауды бастауға мүмкіндік бермейді.

Тұйықталуды анықтау үшін граф құрастырылады (күту графигі, күту графигі), оның шыңдары транзакциялар болып табылады, ал шеттері осы деректерді басып алған транзакцияға деректердің шығарылуын күтетін транзакциялардан бағытталған. Егер графикте цикл болса, тығырықтан шығу орын алды деп саналады. Күту графигін құру, әсіресе таратылған дерекқорларда, қымбат процедура.

Екі фазалы құлыптау – транзакцияның басында транзакция пайдаланатын барлық ресурстарды тартып алу және соңында оларды босату арқылы тығырықтан сақтайды.

Барлық блоктау операциялары бірінші құлыпты ашудан бұрын болуы керек. Оның екі фазасы бар - өсу фазасы, оның барысында тұтқалар жиналады және қысу фазасы, оның барысында тұтқалар босатылады. Ресурстардың бірін басып алу мүмкін болмаса, транзакция қайтадан басталады. Мәміле қажетті ресурстарды ала алмауы мүмкін, мысалы, бірнеше транзакциялар бір ресурстар үшін бәсекелесетін болса.

Екі кезеңді міндеттеме барлық дерекқор репликаларында тапсырманың орындалуын қамтамасыз етеді

Әрбір дерекқор журналға өзгертілетін деректер туралы ақпаратты енгізеді және үйлестірушіге OK (дауыс беру кезеңі) жауап береді. Барлығы «Жарайды» деп жауап бергеннен кейін, үйлестіруші барлығын орындауға міндеттейтін сигнал жібереді. Орындаудан кейін серверлер 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 транзакциясы уақыт белгісі әдісіндегідей кері қайтарылмайды.

Ақпарат көзі: www.habr.com

пікір қалдыру