Транзакции и механизми за техния контрол

сделки

Транзакцията е последователност от операции върху данни, която има начало и край.

Транзакцията е последователно изпълнение на операции за четене и запис. Краят на транзакция може да бъде или запазване на промените (commit), или отмяна на промените (rollback). Във връзка с база данни транзакцията се състои от няколко заявки, които се третират като една заявка.

Транзакциите трябва да отговарят на свойствата на ACID

Атомност. Транзакцията или е завършена напълно, или изобщо не е завършена.

Последователност. При извършване на транзакция не трябва да се нарушават ограниченията, наложени върху данните (например ограничения в базата данни). Съгласуваността предполага, че системата ще бъде прехвърлена от едно правилно състояние в друго правилно състояние.

Изолация. Транзакциите, изпълнявани паралелно, не трябва да си влияят една на друга, например да променят данните, използвани от друга транзакция. Резултатът от изпълнението на паралелни транзакции трябва да бъде същият, както ако транзакциите се изпълняват последователно.

Устойчивост. Веднъж извършени, промените не трябва да се губят.

Дневник на транзакциите

Дневникът съхранява промените, направени от транзакциите, гарантира атомарност и стабилност на данните в случай на повреда на системата

Регистърът съдържа стойностите, които данните са имали преди и след като са били променени от транзакцията. Стратегията на регистрационния файл с предварително записване изисква добавяне на запис в регистрационния файл за предишни стойности преди началото и за крайните стойности след приключване на транзакцията. В случай на внезапно спиране на системата, базата данни чете дневника в обратен ред и анулира промените, направени от транзакциите. След като се натъкне на прекъсната транзакция, базата данни я изпълнява и прави промени за нея в дневника. Тъй като е в състоянието по време на повредата, базата данни чете регистрационния файл в преден ред и връща промените, направени от транзакциите. По този начин се запазват стабилността на транзакциите, които вече са извършени, и атомарността на прекъснатата транзакция.

Простото повторно изпълнение на неуспешни транзакции не е достатъчно за възстановяване.

Пример. Потребителят има $500 в сметката си и решава да ги изтегли от банкомат. В ход са две транзакции. Първият чете стойността на баланса и ако има достатъчно средства в баланса, издава пари на потребителя. Вторият изважда необходимата сума от баланса. Да кажем, че системата се е сринала и първата операция е неуспешна, но втората е неуспешна. В този случай не можем да издадем повторно пари на потребителя, без да върнем системата в първоначалното й състояние с положителен баланс.

Нива на изолация

Прочетете Посветено

Проблемът с мръсното четене е, че една транзакция може да прочете междинния резултат от друга транзакция.

Пример. Първоначалната стойност на баланса е $0. T1 добавя $50 към вашия баланс. T2 чете стойността на баланса ($50). T1 отхвърля промените и излиза. T2 продължава изпълнението с неправилни данни за баланса.

Решението е да се четат фиксирани данни (Read Committed), което забранява четенето на данни, променени от транзакцията. Ако транзакция A е променила определен набор от данни, тогава транзакция B, когато осъществява достъп до тези данни, е принудена да изчака транзакция A да завърши.

Повторно четене

Проблем със загубени актуализации. T1 запазва промените върху промените на T2.

Пример. Първоначалната стойност на баланса е $0 и две транзакции едновременно попълват баланса. Т1 и Т2 отчитат баланс от $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)

Оптимистичният се основава на откриването и разрешаването на конфликти, песимистичният се основава на предотвратяването на възникването на конфликти.

При оптимистичния подход множество потребители разполагат с копия на данните. Първият, който завърши редактирането, запазва промените, докато останалите трябва да ги обединят. Оптимистичният алгоритъм позволява възникването на конфликт, но системата трябва да се възстанови от конфликта.

При песимистичен подход първият потребител, който улови данните, не позволява на другите да получат данните. Ако конфликтите са редки, е разумно да изберете оптимистичната стратегия, тъй като тя осигурява по-високо ниво на едновременност.

Заключване

Ако една транзакция има заключени данни, тогава другите транзакции трябва да изчакат, докато тя бъде отключена при достъп до данните.

Един блок може да бъде насложен върху база данни, таблица, ред или атрибут. Споделеното заключване може да бъде наложено на едни и същи данни от няколко транзакции, позволява на всички транзакции (включително тази, която го е наложила) да се четат, забранява модификацията и изключителното улавяне. Ексклузивното заключване може да бъде наложено само от една транзакция, позволява всякакви действия от налагащата транзакция, забранява всякакви действия от други.

Безизходица е ситуация, при която транзакциите завършват в чакащо състояние, което продължава неопределено време.

Пример. Първата транзакция чака данните, уловени от втората, да бъдат освободени, докато втората изчаква данните, уловени от първата, да бъдат освободени.

Едно оптимистично решение на проблема с безизходицата позволява възникването на безизходица, но след това възстановява системата чрез връщане назад на една от транзакциите, участващи в блокировката.

Търсят се задънени блокировки на определени интервали. Един от методите за откриване е по време, т.е. смятайте, че е възникнало блокиране, ако транзакцията отнема твърде много време за завършване. Когато се открие блокиране, една от транзакциите се връща назад, което позволява на други транзакции, участващи в блокиране, да завършат. Изборът на жертва може да се основава на стойността на транзакциите или техния старшинство (схеми Wait-Die и Wound-wait).

Всяка сделка T присвоен е времеви печат TS съдържащ началния час на транзакцията.

Чакай-умри.

ако TS(Ti) < TS(Tj), Тогава Ti чака, иначе Ti връща се назад и започва отново със същия времеви печат.

Ако млада транзакция е придобила ресурс и по-стара транзакция поиска същия ресурс, тогава на по-старата транзакция е разрешено да изчака. Ако по-стара транзакция е придобила ресурс, тогава по-младата транзакция, изискваща този ресурс, ще бъде върната назад.

Рана-чакай.

ако TS(Ti) < TS(Tj), Тогава Tj връща се назад и започва отново със същото времево клеймо, в противен случай Ti очакване.

Ако по-млада транзакция е придобила ресурс и по-стара транзакция изисква същия ресурс, тогава по-младата транзакция ще бъде върната назад. Ако по-стара транзакция е придобила ресурс, тогава на по-младата транзакция, изискваща този ресурс, е разрешено да изчака. Изборът на жертва, базиран на приоритет, предотвратява задънени блокировки, но връща транзакции, които не са блокирани. Проблемът е, че транзакциите могат да бъдат върнати многократно, защото... по-стара транзакция може да задържи ресурса за дълго време.

Песимистичното решение на проблема с безизходицата не позволява транзакция да започне да се изпълнява, ако има риск от блокиране.

За откриване на блокиране се изгражда граф (граф на чакане, график на чакане), чиито върхове са транзакции, а ръбовете са насочени от транзакции, чакащи освобождаване на данни, към транзакцията, която е уловила тези данни. Счита се, че е възникнало блокиране, ако графиката има цикъл. Конструирането на графика на изчакване, особено в разпределени бази данни, е скъпа процедура.

Двуфазно заключване - предотвратява задънени блокировки, като изземва всички ресурси, използвани от транзакция в началото на транзакцията и ги освобождава в края

Всички блокиращи операции трябва да предхождат първата отключваща. Има две фази - Фаза на нарастване, по време на която хватките се натрупват, и Фаза на свиване, по време на която хватките се освобождават. Ако е невъзможно да се улови някой от ресурсите, транзакцията започва отначало. Възможно е една транзакция да не може да придобие необходимите ресурси, например ако няколко транзакции се конкурират за едни и същи ресурси.

Двуфазовият ангажимент гарантира, че ангажиментът се изпълнява на всички реплики на база данни

Всяка база данни въвежда информация за данните, които ще бъдат променени в дневника и отговаря на координатора OK (фаза на гласуване). След като всички са отговорили 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

Добавяне на нов коментар