{"id":30878,"date":"2019-10-31T21:37:56","date_gmt":"2019-10-31T18:37:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/tranzaktsii-i-mehanizmy-ih-kontrolya\/"},"modified":"2019-10-31T21:37:56","modified_gmt":"2019-10-31T18:37:56","slug":"tranzaktsii-i-mehanizmy-ih-kontrolya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","title":{"rendered":"Transakcje i mechanizmy ich kontroli","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Transakcje<\/h2>\n<p><\/p>\n<h4>Transakcja to sekwencja operacji na danych, kt\u00f3ra ma pocz\u0105tek i koniec.<\/h4>\n<p>\nTransakcja to sekwencyjne wykonywanie operacji odczytu i zapisu. Zako\u0144czeniem transakcji mo\u017ce by\u0107 albo zapisanie zmian (commit), albo ich anulowanie (rollback). W kontek\u015bcie baz danych transakcja to kilka zapyta\u0144, kt\u00f3re s\u0105 traktowane jako jedno zapytanie.<\/p>\n<h4>Transakcje musz\u0105 spe\u0142nia\u0107 w\u0142a\u015bciwo\u015bci ACID.<\/h4>\n<p>\nAtomowo\u015b\u0107. Transakcja jest albo w pe\u0142ni realizowana, albo w og\u00f3le nie jest realizowana.<\/p>\n<p>Sp\u00f3jno\u015b\u0107. Po zako\u0144czeniu transakcji ograniczenia nak\u0142adane na dane (np. constraints w bazach danych) nie mog\u0105 by\u0107 naruszone. Sp\u00f3jno\u015b\u0107 oznacza, \u017ce system zostanie przeniesiony z jednego poprawnego stanu do drugiego.<\/p>\n<p>Izolacja. R\u00f3wnolegle wykonywane transakcje nie powinny wp\u0142ywa\u0107 na siebie nawzajem, na przyk\u0142ad zmienia\u0107 danych, kt\u00f3rych u\u017cywa inna transakcja. Wynik wykonania r\u00f3wnoleg\u0142ych transakcji powinien by\u0107 taki, jakby transakcje by\u0142y wykonywane sekwencyjnie.<\/p>\n<p>Trwa\u0142o\u015b\u0107. Po zatwierdzeniu zmiany nie mog\u0105 zosta\u0107 utracone.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Dziennik transakcji.<\/h2>\n<p><\/p>\n<h4>Dziennik przechowuje zmiany dokonane przez transakcje, zapewniaj\u0105c atomowo\u015b\u0107 i trwa\u0142o\u015b\u0107 danych w przypadku awarii systemu.<\/h4>\n<p>\nDziennik zawiera warto\u015bci, jakie dane mia\u0142y przed i po ich zmianach dokonanych przez transakcje. Strategia write-ahead log wymaga dodania do dziennika zapisu o wcze\u015bniejszych warto\u015bciach przed rozpocz\u0119ciem a o ko\u0144cowych po zako\u0144czeniu transakcji. W przypadku nag\u0142ego zatrzymania systemu, baza danych odczytuje log w odwrotnej kolejno\u015bci i cofa zmiany dokonane przez transakcje. Spotykaj\u0105c przerwan\u0105 transakcj\u0119, baza danych wykonuje j\u0105 i wprowadza jej zmiany do dziennika. W momencie awarii, baza danych odczytuje log w prostej kolejno\u015bci i przywraca zmiany dokonane przez transakcje. W ten spos\u00f3b utrzymuje si\u0119 trwa\u0142o\u015b\u0107 transakcji, kt\u00f3re ju\u017c zosta\u0142y zatwierdzone, oraz atomowo\u015b\u0107 przerwanej transakcji.<\/p>\n<p>Proste ponowne wykonanie b\u0142\u0119dnych transakcji nie jest wystarczaj\u0105ce do przywr\u00f3cenia stanu. <\/p>\n<p><i>Przyk\u0142ad. Na koncie u\u017cytkownika jest 500$, a u\u017cytkownik postanawia je wyp\u0142aci\u0107 przez bankomat. Wykonywane s\u0105 dwie transakcje. Pierwsza odczytuje warto\u015b\u0107 salda, a je\u015bli na koncie jest wystarczaj\u0105ca ilo\u015b\u0107 \u015brodk\u00f3w, wydaje pieni\u0105dze u\u017cytkownikowi. Druga odejmuje potrzebn\u0105 kwot\u0119 z salda. Za\u0142\u00f3\u017cmy, \u017ce wyst\u0105pi\u0142 b\u0142\u0105d systemu i pierwsza operacja si\u0119 nie powiod\u0142a, a druga si\u0119 powiod\u0142a. W takim przypadku nie mo\u017cemy ponownie wyda\u0107 pieni\u0119dzy u\u017cytkownikowi bez przywr\u00f3cenia systemu do pocz\u0105tkowego stanu z dodatnim saldem.<\/i><\/p>\n<h2>Poziomy izolacji<\/h2>\n<p><\/p>\n<h4>Odczyt zatwierdzonych danych (Read Committed)<\/h4>\n<p>\nProblem brudnego odczytu (Dirty Read) polega na tym, \u017ce transakcja mo\u017ce odczyta\u0107 po\u015bredni wynik dzia\u0142ania innej transakcji.<\/p>\n<p><i>Przyk\u0142ad. Pocz\u0105tkowe saldo wynosi 0$. T1 dodaje 50$ do salda. T2 odczytuje warto\u015b\u0107 salda (50$). T1 odrzuca zmiany i ko\u0144czy si\u0119. T2 kontynuuje wykonanie, dysponuj\u0105c nieprawid\u0142owymi danymi o saldzie.<\/i><\/p>\n<p>Rozwi\u0105zaniem jest odczyt zatwierdzonych danych (Read Committed), kt\u00f3ry zabrania odczytu danych zmienionych przez transakcj\u0119. Je\u015bli transakcja A zmieni\u0142a pewien zestaw danych, to transakcja B, przy pr\u00f3bie uzyskania tych danych, musi czeka\u0107 na zako\u0144czenie transakcji A.<\/p>\n<h4>Powtarzalny odczyt (Repeatable Read)<\/h4>\n<p>\nProblem utraconych aktualizacji (Lost Updates). T1 zapisuje zmiany na wierzchu zmian T2.<\/p>\n<p><i>Przyk\u0142ad. Pocz\u0105tkowe saldo wynosi 0$ i dwie transakcje jednocze\u015bnie zwi\u0119kszaj\u0105 saldo. T1 i T2 odczytuj\u0105 saldo r\u00f3wne 0$. Nast\u0119pnie T2 dodaje 200$ do 0$ i zapisuje wynik. T1 dodaje 100$ do 0$ i zapisuje wynik. Ostateczny wynik wynosi 100$ zamiast 300$.<\/i><\/p>\n<p>Problem niepowtarzalnego odczytu (Unrepeatable read). Powt\u00f3rny odczyt tych samych danych zwraca r\u00f3\u017cne warto\u015bci.<\/p>\n<p><i>Przyk\u0142ad. T1 odczytuje warto\u015b\u0107 salda r\u00f3wn\u0105 0$. Nast\u0119pnie T2 dodaje 50$ do salda i ko\u0144czy si\u0119. T1 ponownie odczytuje dane i stwierdza niezgodno\u015b\u0107 z poprzednim wynikiem.<\/i><\/p>\n<p>Powtarzalny odczyt (Repeatable Read) gwarantuje, \u017ce powt\u00f3rny odczyt zwr\u00f3ci ten sam wynik. Dane odczytane przez jedn\u0105 transakcj\u0119 nie mog\u0105 by\u0107 zmieniane w innych do zako\u0144czenia transakcji. Je\u015bli transakcja A odczyta\u0142a pewien zestaw danych, to transakcja B, przy pr\u00f3bie uzyskania tych danych, musi czeka\u0107 na zako\u0144czenie transakcji A.<\/p>\n<h4>Uszeregowany odczyt (Serializable)<\/h4>\n<p>\nProblem fantomowego odczytu (Phantom Reads). Dwa zapytania wybieraj\u0105ce dane na podstawie pewnego warunku zwracaj\u0105 r\u00f3\u017cne warto\u015bci.<\/p>\n<p><i>Przyk\u0142ad. T1 pyta o liczb\u0119 wszystkich u\u017cytkownik\u00f3w, kt\u00f3rych saldo jest wi\u0119ksze ni\u017c 0$ lecz mniejsze ni\u017c 100$. T2 odejmuje 1$ od u\u017cytkownika z saldem 101$. T1 wykonuje zapytanie ponownie.<\/i><\/p>\n<p>Uporz\u0105dkowane odczyty (Serializable). Transakcje s\u0105 wykonywane w pe\u0142ni sekwencyjnie. Zabronione jest aktualizowanie lub dodawanie rekord\u00f3w, kt\u00f3re podlegaj\u0105 warunkom zapytania. Je\u015bli transakcja A pyta o dane ca\u0142ej tabeli, tabela jest w ca\u0142o\u015bci zamra\u017cana dla pozosta\u0142ych transakcji do momentu zako\u0144czenia transakcji A.<\/p>\n<h2>Planista (Scheduler)<\/h2>\n<p><\/p>\n<h4>Ustala kolejno\u015b\u0107, w jakiej powinny by\u0107 wykonywane operacje w przypadku r\u00f3wnolegle przebiegaj\u0105cych transakcji.<\/h4>\n<p>\nZapewnia zadany poziom izolacji. Je\u015bli wynik operacji nie zale\u017cy od ich kolejno\u015bci, to takie operacje s\u0105 przemienne (Permutable). Przemienne s\u0105 operacje odczytu oraz operacje na r\u00f3\u017cnych danych. Operacje odczytu-zapisu i zapisu-zapisu nie s\u0105 przemienne. Zadaniem planisty jest naprzemiennie uk\u0142ada\u0107 operacje wykonywane przez r\u00f3wnoleg\u0142e transakcje, tak aby wynik ich wykonania by\u0142 r\u00f3wnowa\u017cny sekwencyjnemu wykonaniu transakcji.<\/p>\n<h2>Mechanizmy kontroli r\u00f3wnoleg\u0142ych zada\u0144 (Concurrency Control)<\/h2>\n<p><\/p>\n<h4>Optymistyczny, oparty na wykrywaniu i rozwi\u0105zywaniu konflikt\u00f3w, pesymistyczny na zapobieganiu powstawaniu konflikt\u00f3w.<\/h4>\n<p>\nW podej\u015bciu optymistycznym kilku u\u017cytkownik\u00f3w ma dost\u0119p do kopii danych. Pierwszy, kt\u00f3ry zako\u0144czy edycj\u0119, zapisuje zmiany, pozostali musz\u0105 zrealizowa\u0107 scalanie zmian. Algorytm optymistyczny dopuszcza wyst\u0105pienie konfliktu, ale system musi si\u0119 odbudowa\u0107 po konflikcie.<\/p>\n<p>W podej\u015bciu pesymistycznym pierwszy u\u017cytkownik, kt\u00f3ry zablokowa\u0142 dane, uniemo\u017cliwia pozosta\u0142ym dost\u0119p do tych danych. Je\u015bli konflikty s\u0105 rzadkie, rozs\u0105dniej jest wybra\u0107 strategi\u0119 optymistyczn\u0105, poniewa\u017c zapewnia ona wy\u017cszy poziom r\u00f3wnoleg\u0142o\u015bci.<\/p>\n<h2>Blokada (Locking)<\/h2>\n<p><\/p>\n<h4>Je\u015bli jedna transakcja zablokowa\u0142a dane, inne transakcje przy pr\u00f3bie dost\u0119pu do danych musz\u0105 czeka\u0107 na odblokowanie.<\/h4>\n<p>\nBlok mo\u017ce by\u0107 na\u0142o\u017cony na baz\u0119 danych, tabel\u0119, rz\u0105d lub atrybut. Wsp\u00f3lny zamek (Shared Lock) mo\u017ce by\u0107 na\u0142o\u017cony na te same dane przez kilka transakcji, pozwala wszystkim transakcjom (w tym nak\u0142adaj\u0105cej) na odczyt, zabrania modyfikacji i zablokowania wy\u0142\u0105cznie. Zamek wy\u0142\u0105czny (Exclusive Lock) mo\u017ce by\u0107 na\u0142o\u017cony tylko przez jedn\u0105 transakcj\u0119, pozwala na wszystkie dzia\u0142ania nak\u0142adaj\u0105cej transakcji, zabrania wszelkich dzia\u0142a\u0144 innym.<\/p>\n<h4>Martwym blokowaniem nazywa si\u0119 sytuacj\u0119, w kt\u00f3rej transakcje znajduj\u0105 si\u0119 w trybie oczekiwania, kt\u00f3ry trwa w niesko\u0144czono\u015b\u0107.<\/h4>\n<p>\n<i>Przyk\u0142ad. Pierwsza transakcja czeka na zwolnienie danych zablokowanych przez drug\u0105, podczas gdy druga czeka na zwolnienie danych zablokowanych przez pierwsz\u0105.<\/i><\/p>\n<h4>Optymistyczne rozwi\u0105zanie problemu deadlock\u00f3w pozwala na wyst\u0105pienie deadlocku, ale nast\u0119pnie przywraca system, wycofuj\u0105c jedn\u0105 z transakcji zaanga\u017cowanych w deadlock.<\/h4>\n<p>\nW okre\u015blonych odst\u0119pach czasu przeprowadzana jest analiza deadlock\u00f3w. Jednym ze sposob\u00f3w wykrywania jest analiza czasu, tzn. uwa\u017ca si\u0119, \u017ce wyst\u0105pi\u0142 deadlock, je\u015bli transakcja trwa zbyt d\u0142ugo. Gdy deadlock zostanie znaleziony, jedna z transakcji jest wycofywana, co pozwala innym transakcjom zaanga\u017cowanym w deadlock na zako\u0144czenie. Wyb\u00f3r ofiary mo\u017ce by\u0107 oparty na kosztach transakcji lub ich starsze\u0144stwie (schematy Wait-Die i Wound-wait). <\/p>\n<p>Ka\u017cdej transakcji <b>T<\/b> przypisywana jest znacznik czasowy <b>TS<\/b> zawieraj\u0105cy czas rozpocz\u0119cia wykonywania transakcji.<\/p>\n<p>Wait-Die. <\/p>\n<p><u>Je\u015bli <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, to <b>Ti<\/b> czeka, w przeciwnym razie <b>Ti<\/b> jest wycofywana i rozpoczyna si\u0119 od nowa z tym samym znacznikiem czasowym.<\/u><\/p>\n<p>Je\u015bli m\u0142odsza transakcja zdoby\u0142a zas\u00f3b, a starsza prosi o ten sam zas\u00f3b, to starszej transakcji zezwala si\u0119 na czekanie. Je\u015bli starsza transakcja zdoby\u0142a zas\u00f3b, m\u0142odsza transakcja, kt\u00f3ra prosi o ten zas\u00f3b, zostanie wycofana.<\/p>\n<p>Wound-wait. <\/p>\n<p><u>Je\u015bli <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, to <b>Tj<\/b> jest wycofywana i rozpoczyna si\u0119 od nowa z tym samym znacznikiem czasowym, w przeciwnym razie <b>Ti<\/b> czeka.<\/u><\/p>\n<p>Je\u015bli m\u0142odsza transakcja zajmie zas\u00f3b, a starsza transakcja spr\u00f3buje uzyska\u0107 ten sam zas\u00f3b, m\u0142odsza transakcja zostanie wycofana. Je\u015bli starsza transakcja zajmie zas\u00f3b, m\u0142odsza transakcja, kt\u00f3ra pr\u00f3buje uzyska\u0107 dany zas\u00f3b, mo\u017ce czeka\u0107. Wyb\u00f3r ofiary na podstawie staro\u015bci zapobiega wyst\u0105pieniu zakleszczenia, ale wycofuje transakcje, kt\u00f3re nie s\u0105 w stanie zakleszczenia. Problem polega na tym, \u017ce transakcje mog\u0105 by\u0107 wycofywane wiele razy, poniewa\u017c starsza transakcja mo\u017ce d\u0142ugo utrzymywa\u0107 zas\u00f3b.<\/p>\n<h4>Pesymistyczne rozwi\u0105zanie problemu zakleszcze\u0144 nie pozwala na rozpocz\u0119cie wykonania transakcji, je\u015bli istnieje ryzyko wyst\u0105pienia zakleszczenia.<\/h4>\n<p>\nAby wykry\u0107 zakleszczenie, buduje si\u0119 graf (graf oczekiwania, wait-for-graph), w kt\u00f3rym w\u0119z\u0142y to transakcje, a kraw\u0119dzie s\u0105 skierowane od transakcji oczekuj\u0105cych na zwolnienie danych do transakcji, kt\u00f3re te dane zaj\u0119\u0142y. Zak\u0142ada si\u0119, \u017ce zakleszczenie mia\u0142o miejsce, je\u015bli graf zawiera cykl. Budowanie grafu oczekiwania, szczeg\u00f3lnie w rozproszonych bazach danych, to kosztowna procedura.<\/p>\n<h4>Dwufazowe blokowanie \u2014 zapobieganie zakleszczeniom poprzez zaj\u0119cie wszystkich zasob\u00f3w wykorzystywanych przez transakcj\u0119 na pocz\u0105tku transakcji i ich zwolnienie na ko\u0144cu.<\/h4>\n<p>\nWszystkie operacje blokuj\u0105ce musz\u0105 poprzedza\u0107 pierwsz\u0105 operacj\u0119 zwalniaj\u0105c\u0105. Ma dwie fazy \u2014 Faza Rosn\u0105ca, w kt\u00f3rej nast\u0119puje kumulacja zaj\u0119\u0107 i Faza Kurcz\u0105ca, w kt\u00f3rej dochodzi do zwolnienia zaj\u0119\u0107. W przypadku niemo\u017cno\u015bci zaj\u0119cia jednego z zasob\u00f3w transakcja rozpoczyna si\u0119 od nowa. Mo\u017ce wyst\u0105pi\u0107 sytuacja, w kt\u00f3rej transakcja nie b\u0119dzie mog\u0142a zaj\u0105\u0107 wymaganych zasob\u00f3w, na przyk\u0142ad je\u015bli kilka transakcji b\u0119dzie konkurowa\u0107 o te same zasoby.<\/p>\n<h4>Dwufazowe potwierdzenie zapewnia wykonanie zatwierdzenia na wszystkich replikach bazy danych.<\/h4>\n<p>\nKa\u017cda baza danych wprowadza informacje o danych, kt\u00f3re b\u0119d\u0105 zmienione, do dziennika i odpowiada koordynatorowi OK (Faza G\u0142osowania). Po tym, jak wszyscy odpowiedz\u0105 na OK, koordynator wysy\u0142a sygna\u0142 zobowi\u0105zuj\u0105cy wszystkich do dokonania zatwierdzenia. Po zatwierdzeniu <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/dts-los-angeles\/\"   title=\"serwera\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3482\">serwera<\/a> wszyscy odpowiadaj\u0105 OK, je\u015bli cho\u0107 jeden nie odpowiada OK, to koordynator wysy\u0142a sygna\u0142 anulowania zmian do wszystkich serwer\u00f3w (Faza Zako\u0144czenia).<\/p>\n<h2>Metoda znacznik\u00f3w czasowych<\/h2>\n<p><\/p>\n<h4>Starsza transakcja jest wycofywana w przypadku pr\u00f3by dost\u0119pu do danych zaj\u0119tych przez m\u0142odsz\u0105 transakcj\u0119.<\/h4>\n<p>\nKa\u017cdej transakcji przypisywany jest znacznik czasowy <b>TS<\/b> odpowiadaj\u0105cy momentowi rozpocz\u0119cia jej wykonania. Je\u015bli <b>Ti<\/b> jest starszy <b>Tj<\/b>, to <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>.<\/p>\n<p>Kiedy transakcja jest wycofywana, otrzymuje nowy znacznik czasowy. Ka\u017cdy obiekt danych <b>Q<\/b> zwi\u0105zany z transakcj\u0105 oznaczany jest dwoma znacznikami. <b>W-TS(Q)<\/b> \u2014 znacznik czasowy najnowszej transakcji, kt\u00f3ra pomy\u015blnie dokona\u0142a zapisu nad <b>Q<\/b>. <b>R-TS(Q)<\/b> \u2014 znacznik czasowy najnowszej transakcji, kt\u00f3ra dokona\u0142a zapisu odczytu nad <b>Q<\/b>.<\/p>\n<p>Kiedy transakcja <b>T<\/b> \u017c\u0105da odczytu danych <b>Q<\/b> s\u0105 dwa scenariusze.<\/p>\n<p><u>Je\u015bli <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, to znaczy, \u017ce dane zosta\u0142y zaktualizowane przez m\u0142odsza transakcj\u0119, w\u00f3wczas transakcja <b>T<\/b> jest wycofywana.<\/u><\/p>\n<p><u>Je\u015bli <b>TS(T)<\/b> &gt;= <b>W-TS(Q)<\/b>, to odczyt jest wykonywany i <b>R-TS(Q)<\/b> staje si\u0119 <b>MAX(R-TS(Q), TS(T))<\/b>.<\/u><\/p>\n<p>Kiedy transakcja <b>T<\/b> \u017c\u0105da zmiany danych <b>Q<\/b> s\u0105 dwa scenariusze. <\/p>\n<p><u>Je\u015bli <b>TS(T)<\/b> &lt; <b>R-TS(Q)<\/b>, to znaczy, \u017ce dane zosta\u0142y ju\u017c odczytane przez m\u0142odsz\u0105 transakcj\u0119 i je\u015bli zostanie dokonana zmiana, to wyst\u0105pi konflikt. Transakcja <b>T<\/b> jest wycofywana. <\/u><\/p>\n<p><u>Je\u015bli <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, to znaczy, \u017ce transakcja pr\u00f3buje nadpisa\u0107 nowsz\u0105 warto\u015b\u0107, transakcja T jest wycofywana. W pozosta\u0142ych przypadkach zmiana jest dokonywana i <b>W-TS(Q)<\/b> staje si\u0119 r\u00f3wna <b>TS(T)<\/b>.<\/u><\/p>\n<p>Nie ma potrzeby kosztownego budowania grafu oczekiwania. Starsze transakcje zale\u017c\u0105 od nowszych, co oznacza, \u017ce w grafie oczekiwania nie ma cykli. Nie wyst\u0119puj\u0105 martwe blokady, poniewa\u017c transakcje nie czekaj\u0105, a od razu s\u0105 wycofywane. Mo\u017cliwe s\u0105 kaskadowe wycofania. Je\u017celi <b>Ti<\/b> zosta\u0142a wycofana, a <b>Tj<\/b> odczyta\u0142a dane, kt\u00f3re zmieni\u0142a <b>Ti<\/b>, to <b>Tj<\/b> te\u017c musi zosta\u0107 wycofana. Je\u015bli przy tym <b>Tj<\/b> ju\u017c zosta\u0142a zatwierdzona, to dojdzie do naruszenia zasady trwa\u0142o\u015bci.<\/p>\n<p>Jednym z rozwi\u0105za\u0144 kaskadowych wycofa\u0144. Transakcja wykonuje wszystkie operacje zapisu na ko\u0144cu, a pozosta\u0142e transakcje musz\u0105 czeka\u0107 na zako\u0144czenie tej operacji. Transakcje oczekuj\u0105 na zatwierdzenie przed odczytem.<\/p>\n<h4>Regu\u0142a pisania Thomasa \u2014 odmiana metody znacznik\u00f3w czasowych, w kt\u00f3rej dane zaktualizowane przez m\u0142odsz\u0105 transakcj\u0119 nie mog\u0105 by\u0107 nadpisywane przez starsz\u0105<\/h4>\n<p>\nTransakcja <b>T<\/b> \u017c\u0105da zmiany danych <b>Q<\/b>. Je\u015bli <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, to znaczy, \u017ce transakcja pr\u00f3buje nadpisa\u0107 nowsz\u0105 warto\u015b\u0107, transakcja T nie jest wycofywana jak w metodzie znacznik\u00f3w czasowych.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446662\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f, commit) \u043b\u0438\u0431\u043e \u043e\u0442\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043e\u0442\u043a\u0430\u0442, rollback). \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0411\u0414 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0430\u043a\u0442\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c ACID \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-30878","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:37:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:37:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Transakcje i mechanizmy ich kontroli | ProHoster","description":"Transakcje Transakcj\u0105 nazywa si\u0119 sekwencj\u0119 operacji na danych maj\u0105c\u0105 pocz\u0105tek i koniec. Transakcja to sekwencyjne wykonywanie operacji odczytu i zapisu.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f | ProHoster","og:description":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u044e\u0449\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:37:56+00:00","article:modified_time":"2019-10-31T18:37:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30878","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-22 15:31:13","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:27:38","updated":"2026-02-22 15:31:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=30878"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30878\/revisions"}],"predecessor-version":[{"id":162008,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30878\/revisions\/162008"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=30878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=30878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=30878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}