{"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\/pt\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","title":{"rendered":"Transa\u00e7\u00f5es e mecanismos de controle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Transa\u00e7\u00f5es<\/h2>\n<p><\/p>\n<h4>Uma transa\u00e7\u00e3o \u00e9 uma sequ\u00eancia de opera\u00e7\u00f5es sobre dados que tem um in\u00edcio e um fim.<\/h4>\n<p>\nUma transa\u00e7\u00e3o \u00e9 a execu\u00e7\u00e3o sequencial de opera\u00e7\u00f5es de leitura e grava\u00e7\u00e3o. O final da transa\u00e7\u00e3o pode ser a confirma\u00e7\u00e3o das altera\u00e7\u00f5es (commit) ou a revers\u00e3o das altera\u00e7\u00f5es (rollback). Em rela\u00e7\u00e3o a bancos de dados, uma transa\u00e7\u00e3o \u00e9 um conjunto de solicita\u00e7\u00f5es tratadas como uma \u00fanica solicita\u00e7\u00e3o.<\/p>\n<h4>As transa\u00e7\u00f5es devem satisfazer \u00e0s propriedades ACID.<\/h4>\n<p>\nAtomicidade. Uma transa\u00e7\u00e3o \u00e9 executada completamente ou n\u00e3o \u00e9 executada de forma alguma.<\/p>\n<p>Consist\u00eancia. Ao finalizar a transa\u00e7\u00e3o, as restri\u00e7\u00f5es impostas aos dados n\u00e3o devem ser violadas (como as constraints em um banco de dados). A consist\u00eancia implica que o sistema deve ser transferido de um estado v\u00e1lido para outro estado v\u00e1lido.<\/p>\n<p>Isolamento. Transa\u00e7\u00f5es executadas em paralelo n\u00e3o devem interferir umas nas outras, por exemplo, alterando dados usados por outra transa\u00e7\u00e3o. O resultado da execu\u00e7\u00e3o de transa\u00e7\u00f5es paralelas deve ser o mesmo que se as transa\u00e7\u00f5es fossem executadas sequencialmente.<\/p>\n<p>Durabilidade. Ap\u00f3s a confirma\u00e7\u00e3o, as altera\u00e7\u00f5es n\u00e3o devem ser perdidas.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Registro de transa\u00e7\u00f5es<\/h2>\n<p><\/p>\n<h4>O registro armazena as altera\u00e7\u00f5es realizadas pelas transa\u00e7\u00f5es, garantindo a atomicidade e a durabilidade dos dados em caso de falha do sistema.<\/h4>\n<p>\nO log cont\u00e9m os valores que os dados tinham antes e depois de serem alterados pela transa\u00e7\u00e3o. A estrat\u00e9gia de Write-ahead log exige que uma entrada sobre os valores anteriores seja adicionada ao log antes do in\u00edcio, e os finais ap\u00f3s a conclus\u00e3o da transa\u00e7\u00e3o. Caso o sistema seja interrompido repentinamente, o banco de dados l\u00ea o log em ordem inversa e reverte as altera\u00e7\u00f5es feitas pelas transa\u00e7\u00f5es. Ao encontrar uma transa\u00e7\u00e3o interrompida, o banco de dados executa-a e registra as mudan\u00e7as no log. Quando em um estado no momento da falha, o banco de dados l\u00ea o log em ordem direta e reverte as altera\u00e7\u00f5es realizadas pelas transa\u00e7\u00f5es. Isso preserva a durabilidade das transa\u00e7\u00f5es j\u00e1 confirmadas e a atomicidade da transa\u00e7\u00e3o interrompida.<\/p>\n<p>Simplesmente repetir transa\u00e7\u00f5es com erro n\u00e3o \u00e9 suficiente para a recupera\u00e7\u00e3o. <\/p>\n<p><i>Exemplo. O usu\u00e1rio tem 500$ na conta e decide retirar esse valor atrav\u00e9s de um caixa eletr\u00f4nico. Duas transa\u00e7\u00f5es s\u00e3o realizadas. A primeira l\u00ea o valor do saldo e, se houver fundos suficientes, libera o dinheiro para o usu\u00e1rio. A segunda subtrai a quantia do saldo. Suponha que ocorreu uma falha no sistema e a primeira opera\u00e7\u00e3o n\u00e3o foi conclu\u00edda, enquanto a segunda foi. Nesse caso, n\u00e3o podemos liberar novamente o dinheiro para o usu\u00e1rio sem restaurar o sistema ao seu estado original com saldo positivo.<\/i><\/p>\n<h2>N\u00edveis de isolamento<\/h2>\n<p><\/p>\n<h4>Leitura de dados fixos (Read Committed)<\/h4>\n<p>\nO problema da leitura suja (Dirty Read) \u00e9 que uma transa\u00e7\u00e3o pode ler um resultado intermedi\u00e1rio de outra transa\u00e7\u00e3o.<\/p>\n<p><i>Exemplo. O saldo inicial \u00e9 0$. T1 adiciona 50$ ao saldo. T2 l\u00ea o saldo (50$). T1 reverte as altera\u00e7\u00f5es e finaliza. T2 continua a execu\u00e7\u00e3o possuindo dados incorretos sobre o saldo.<\/i><\/p>\n<p>A solu\u00e7\u00e3o \u00e9 a leitura de dados fixos (Read Committed), que pro\u00edbe a leitura de dados que foram alterados por outra transa\u00e7\u00e3o. Se a transa\u00e7\u00e3o A alterou um determinado conjunto de dados, a transa\u00e7\u00e3o B deve esperar a conclus\u00e3o da transa\u00e7\u00e3o A para acessar esses dados.<\/p>\n<h4>Leitura repet\u00edvel (Repeatable Read)<\/h4>\n<p>\nO problema das atualiza\u00e7\u00f5es perdidas (Lost Updates). T1 salva altera\u00e7\u00f5es sobre as altera\u00e7\u00f5es de T2.<\/p>\n<p><i>Exemplo. O saldo inicial \u00e9 0$ e duas transa\u00e7\u00f5es aumentam o saldo simultaneamente. T1 e T2 l\u00eaem um saldo de 0$. Em seguida, T2 adiciona 200$ a 0$ e salva o resultado. T1 adiciona 100$ a 0$ e salva o resultado. O resultado final \u00e9 100$ em vez de 300$.<\/i><\/p>\n<p>O problema da leitura n\u00e3o repet\u00edvel (Unrepeatable read). Uma leitura repetida dos mesmos dados retorna valores diferentes.<\/p>\n<p><i>Exemplo. T1 l\u00ea um saldo de 0$. Depois, T2 adiciona 50$ ao saldo e finaliza. T1 l\u00ea os dados novamente e encontra uma discrep\u00e2ncia com o resultado anterior.<\/i><\/p>\n<p>Leitura repet\u00edvel (Repeatable Read) garante que uma leitura repetida retornar\u00e1 o mesmo resultado. Os dados lidos por uma transa\u00e7\u00e3o n\u00e3o podem ser alterados por outras at\u00e9 que a transa\u00e7\u00e3o seja conclu\u00edda. Se a transa\u00e7\u00e3o A leu um determinado conjunto de dados, a transa\u00e7\u00e3o B deve esperar a conclus\u00e3o da transa\u00e7\u00e3o A para acessar esses dados.<\/p>\n<h4>Leitura ordenada (Serializable)<\/h4>\n<p>\nProblema de leitura fantasma (Phantom Reads). Duas consultas que selecionam dados com base em uma determinada condi\u00e7\u00e3o retornam valores diferentes.<\/p>\n<p><i>Exemplo. T1 consulta a quantidade de todos os usu\u00e1rios cujo saldo \u00e9 superior a 0$ mas inferior a 100$. T2 deduz 1$ do usu\u00e1rio com saldo de 101$. T1 executa a consulta novamente.<\/i><\/p>\n<p>Leitura ordenada (Serializable). Transa\u00e7\u00f5es s\u00e3o executadas como totalmente sequenciais. \u00c9 proibido atualizar e adicionar registros que se enquadram nas condi\u00e7\u00f5es da consulta. Se a transa\u00e7\u00e3o A solicitou os dados de toda a tabela, a tabela inteira \u00e9 congelada para as demais transa\u00e7\u00f5es at\u00e9 a conclus\u00e3o da transa\u00e7\u00e3o A.<\/p>\n<h2>Agendador (Scheduler)<\/h2>\n<p><\/p>\n<h4>Determina a ordem em que as opera\u00e7\u00f5es devem ser executadas durante transa\u00e7\u00f5es que ocorrem em paralelo.<\/h4>\n<p>\nGarante um n\u00edvel de isolamento especificado. Se o resultado da execu\u00e7\u00e3o das opera\u00e7\u00f5es n\u00e3o depende da sua ordem, ent\u00e3o essas opera\u00e7\u00f5es s\u00e3o comutativas (Permutable). Opera\u00e7\u00f5es de leitura e opera\u00e7\u00f5es sobre dados diferentes s\u00e3o comutativas. Opera\u00e7\u00f5es de leitura-escrita e escrita-escrita n\u00e3o s\u00e3o comutativas. A tarefa do agendador \u00e9 alternar as opera\u00e7\u00f5es realizadas por transa\u00e7\u00f5es paralelas de modo que o resultado seja equivalente \u00e0 execu\u00e7\u00e3o sequencial das transa\u00e7\u00f5es.<\/p>\n<h2>Mecanismos de controle de tarefas paralelas (Concurrency Control)<\/h2>\n<p><\/p>\n<h4>Otimista baseado na detec\u00e7\u00e3o e resolu\u00e7\u00e3o de conflitos, pessimista na preven\u00e7\u00e3o de conflitos.<\/h4>\n<p>\nNo enfoque otimista, v\u00e1rios usu\u00e1rios recebem c\u00f3pias dos dados. O primeiro a terminar a edi\u00e7\u00e3o salva as altera\u00e7\u00f5es, enquanto os demais devem realizar a fus\u00e3o das altera\u00e7\u00f5es. O algoritmo otimista permite que um conflito ocorra, mas o sistema deve se recuperar ap\u00f3s o conflito.<\/p>\n<p>No enfoque pessimista, o primeiro usu\u00e1rio a capturar os dados impede que os outros acessem os dados. Se os conflitos s\u00e3o raros, \u00e9 razo\u00e1vel escolher uma estrat\u00e9gia otimista, pois ela proporciona um n\u00edvel mais alto de paralelismo.<\/p>\n<h2>Bloqueio (Locking)<\/h2>\n<p><\/p>\n<h4>Se uma transa\u00e7\u00e3o bloqueou os dados, as demais transa\u00e7\u00f5es que tentarem acessar os dados devem aguardar a libera\u00e7\u00e3o.<\/h4>\n<p>\nUm bloqueio pode ser aplicado a um banco de dados, tabela, linha ou atributo. Um bloqueio compartilhado (Shared Lock) pode ser imposto a um mesmo dado por v\u00e1rias transa\u00e7\u00f5es, permitindo que todas as transa\u00e7\u00f5es (incluindo a que aplicou) leiam, mas proibindo altera\u00e7\u00f5es e bloqueios exclusivos. Um bloqueio exclusivo (Exclusive Lock) pode ser aplicado apenas por uma transa\u00e7\u00e3o, permitindo qualquer a\u00e7\u00e3o da transa\u00e7\u00e3o que imp\u00f4s, mas proibindo qualquer a\u00e7\u00e3o das demais.<\/p>\n<h4>Um deadlock \u00e9 uma situa\u00e7\u00e3o em que as transa\u00e7\u00f5es ficam em um estado de espera que dura indefinidamente.<\/h4>\n<p>\n<i>Exemplo. A primeira transa\u00e7\u00e3o aguarda a libera\u00e7\u00e3o dos dados capturados pela segunda, enquanto a segunda aguarda a libera\u00e7\u00e3o dos dados capturados pela primeira.<\/i><\/p>\n<h4>A solu\u00e7\u00e3o otimista para problemas de deadlock permite que o deadlock aconte\u00e7a, mas ent\u00e3o restaura o sistema revertendo uma das transa\u00e7\u00f5es envolvidas no deadlock.<\/h4>\n<p>\nCom uma certa periodicidade, \u00e9 realizada a busca por deadlocks. Um dos m\u00e9todos de detec\u00e7\u00e3o \u00e9 baseado no tempo, ou seja, considerar que um deadlock ocorreu se uma transa\u00e7\u00e3o est\u00e1 sendo executada por tempo demais. Quando um deadlock \u00e9 encontrado, uma das transa\u00e7\u00f5es \u00e9 revertida, permitindo que outras transa\u00e7\u00f5es envolvidas no deadlock sejam conclu\u00eddas. A escolha da v\u00edtima pode ser baseada no custo das transa\u00e7\u00f5es ou na sua antiguidade (esquemas Wait-Die e Wound-wait). <\/p>\n<p>A cada transa\u00e7\u00e3o <b>T<\/b> \u00e9 atribu\u00edda uma marca temporal. <b>TS<\/b> contendo o tempo de in\u00edcio da execu\u00e7\u00e3o da transa\u00e7\u00e3o.<\/p>\n<p>Wait-Die. <\/p>\n<p><u>Se <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, ent\u00e3o <b>Ti<\/b> aguarda, caso contr\u00e1rio <b>Ti<\/b> \u00e9 revertida e reiniciada com a mesma marca temporal.<\/u><\/p>\n<p>Se uma transa\u00e7\u00e3o jovem capturou um recurso, e uma transa\u00e7\u00e3o mais antiga solicita o mesmo recurso, ent\u00e3o a transa\u00e7\u00e3o mais velha pode aguardar. Se uma transa\u00e7\u00e3o mais antiga capturou um recurso, ent\u00e3o a transa\u00e7\u00e3o jovem que est\u00e1 solicitando esse recurso ser\u00e1 revertida.<\/p>\n<p>Wound-wait. <\/p>\n<p><u>Se <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>, ent\u00e3o <b>Tj<\/b> \u00e9 revertida e reiniciada com a mesma marca temporal, caso contr\u00e1rio <b>Ti<\/b> aguarda.<\/u><\/p>\n<p>Se uma transa\u00e7\u00e3o mais jovem capturou um recurso e uma transa\u00e7\u00e3o mais antiga solicita o mesmo recurso, a transa\u00e7\u00e3o mais jovem ser\u00e1 revertida. Se uma transa\u00e7\u00e3o mais antiga capturou o recurso, a transa\u00e7\u00e3o mais jovem solicitando esse recurso \u00e9 permitida a esperar. A escolha da v\u00edtima baseada na antiguidade previne o surgimento de deadlocks, mas reverte transa\u00e7\u00f5es que n\u00e3o est\u00e3o em estado de deadlock. O problema \u00e9 que transa\u00e7\u00f5es podem ser revertidas muitas vezes, j\u00e1 que uma transa\u00e7\u00e3o mais antiga pode manter o recurso por um longo tempo.<\/p>\n<h4>Uma solu\u00e7\u00e3o pessimista para o problema de deadlocks n\u00e3o permite que uma transa\u00e7\u00e3o comece a execu\u00e7\u00e3o se houver risco de um deadlock.<\/h4>\n<p>\nPara detectar deadlocks, um gr\u00e1fico (gr\u00e1fico de espera, wait-for-graph) \u00e9 constru\u00eddo, em que os v\u00e9rtices s\u00e3o transa\u00e7\u00f5es e as arestas apontam de transa\u00e7\u00f5es que aguardam a libera\u00e7\u00e3o de dados para a transa\u00e7\u00e3o que capturou esses dados. Considera-se que um deadlock ocorreu se o gr\u00e1fico tiver ciclicidade. A constru\u00e7\u00e3o do gr\u00e1fico de espera, especialmente em bancos de dados distribu\u00eddos, \u00e9 um procedimento dispendioso.<\/p>\n<h4>O bloqueio em duas fases \u2014 evitar deadlocks capturando todos os recursos utilizados pela transa\u00e7\u00e3o no in\u00edcio e os liberando no final.<\/h4>\n<p>\nTodas as opera\u00e7\u00f5es de bloqueio devem preceder a primeira opera\u00e7\u00e3o de desbloqueio. Possui duas fases \u2014 a Fase de Crescimento, na qual ocorre a acumula\u00e7\u00e3o de capturas, e a Fase de Redu\u00e7\u00e3o, na qual ocorrem as libera\u00e7\u00f5es. Caso n\u00e3o seja poss\u00edvel capturar um dos recursos, a transa\u00e7\u00e3o inicia novamente. \u00c9 poss\u00edvel que uma transa\u00e7\u00e3o n\u00e3o consiga capturar os recursos necess\u00e1rios, por exemplo, se v\u00e1rias transa\u00e7\u00f5es competirem pelos mesmos recursos.<\/p>\n<h4>O commit em duas fases garante a execu\u00e7\u00e3o do commit em todas as r\u00e9plicas do banco de dados.<\/h4>\n<p>\nCada banco de dados registra informa\u00e7\u00f5es sobre os dados que ser\u00e3o alterados em um log e responde ao coordenador com um OK (Fase de Vota\u00e7\u00e3o). Ap\u00f3s todos responderem OK, o coordenador envia um sinal obrigando todos a realizarem o commit. Ap\u00f3s o commit. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/dts-los-angeles\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3482\">servidor<\/a> respondem com OK; se algum n\u00e3o responder OK, o coordenador envia um sinal de cancelamento das altera\u00e7\u00f5es para todos os servidores (Fase de Conclus\u00e3o).<\/p>\n<h2>M\u00e9todo de carimbo de tempo.<\/h2>\n<p><\/p>\n<h4>Uma transa\u00e7\u00e3o mais antiga \u00e9 revertida ao tentar acessar dados envolvidos em uma transa\u00e7\u00e3o mais jovem.<\/h4>\n<p>\nCada transa\u00e7\u00e3o recebe um timestamp <b>TS<\/b> que corresponde ao tempo de in\u00edcio da execu\u00e7\u00e3o. Se <b>Ti<\/b> mais velho <b>Tj<\/b>, ent\u00e3o <b>TS(Ti)<\/b> &lt; <b>TS(Tj)<\/b>.<\/p>\n<p>Quando a transa\u00e7\u00e3o \u00e9 revertida, recebe um novo timestamp. Cada objeto de dados <b>Q<\/b> envolvido na transa\u00e7\u00e3o \u00e9 marcado com dois timestamps. <b>W-TS(Q)<\/b> \u2014 o timestamp da transa\u00e7\u00e3o mais recente que fez uma grava\u00e7\u00e3o sobre <b>Q<\/b>. <b>R-TS(Q)<\/b> \u2014 o timestamp da transa\u00e7\u00e3o mais recente que fez uma leitura sobre <b>Q<\/b>.<\/p>\n<p>Quando a transa\u00e7\u00e3o <b>T<\/b> solicita a leitura de dados <b>Q<\/b> s\u00e3o poss\u00edveis duas op\u00e7\u00f5es.<\/p>\n<p><u>Se <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, ou seja, se os dados foram atualizados por uma transa\u00e7\u00e3o mais nova, a transa\u00e7\u00e3o <b>T<\/b> \u00e9 revertida.<\/u><\/p>\n<p><u>Se <b>TS(T)<\/b> &gt;= <b>W-TS(Q)<\/b>, ent\u00e3o a leitura \u00e9 feita e <b>R-TS(Q)<\/b> torna-se <b>MAX(R-TS(Q), TS(T))<\/b>.<\/u><\/p>\n<p>Quando a transa\u00e7\u00e3o <b>T<\/b> solicita a altera\u00e7\u00e3o de dados <b>Q<\/b> s\u00e3o poss\u00edveis duas op\u00e7\u00f5es. <\/p>\n<p><u>Se <b>TS(T)<\/b> &lt; <b>R-TS(Q)<\/b>, ou seja, se os dados j\u00e1 foram lidos por uma transa\u00e7\u00e3o mais nova e, se a altera\u00e7\u00e3o for feita, ocorrer\u00e1 um conflito. A transa\u00e7\u00e3o <b>T<\/b> \u00e9 revertida. <\/u><\/p>\n<p><u>Se <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, ou seja, se a transa\u00e7\u00e3o tenta regravar um valor mais novo, a transa\u00e7\u00e3o T \u00e9 revertida. Nos demais casos, a altera\u00e7\u00e3o \u00e9 realizada e <b>W-TS(Q)<\/b> torna-se igual a <b>TS(T)<\/b>.<\/u><\/p>\n<p>N\u00e3o h\u00e1 necessidade de constru\u00e7\u00e3o cara do grafo de espera. Transa\u00e7\u00f5es mais velhas dependem de transa\u00e7\u00f5es mais novas, portanto, n\u00e3o h\u00e1 ciclos no grafo de espera. N\u00e3o h\u00e1 deadlocks, pois as transa\u00e7\u00f5es n\u00e3o esperam, mas reagem imediatamente. Revers\u00f5es em cascata s\u00e3o poss\u00edveis. Se <b>Ti<\/b> foi revertida, e <b>Tj<\/b> leu dados que alterou <b>Ti<\/b>, ent\u00e3o <b>Tj<\/b> tamb\u00e9m deve ser revertida. Se durante isso <b>Tj<\/b> j\u00e1 foi confirmada, ocorrer\u00e1 uma viola\u00e7\u00e3o do princ\u00edpio de consist\u00eancia.<\/p>\n<p>Uma das solu\u00e7\u00f5es para revers\u00f5es em cascata. A transa\u00e7\u00e3o realiza todas as opera\u00e7\u00f5es de grava\u00e7\u00e3o no final, e as outras transa\u00e7\u00f5es devem esperar a conclus\u00e3o dessa opera\u00e7\u00e3o. As transa\u00e7\u00f5es aguardam a confirma\u00e7\u00e3o antes da leitura.<\/p>\n<h4>A regra de escrita de Thomas \u2014 uma varia\u00e7\u00e3o do m\u00e9todo dos timestamps em que dados atualizados por uma transa\u00e7\u00e3o mais nova n\u00e3o podem ser sobrescritos por uma transa\u00e7\u00e3o mais antiga.<\/h4>\n<p>\nA transa\u00e7\u00e3o <b>T<\/b> solicita a altera\u00e7\u00e3o de dados <b>Q<\/b>. Se <b>TS(T)<\/b> &lt; <b>W-TS(Q)<\/b>, ou seja, se a transa\u00e7\u00e3o tenta regravar um valor mais novo, a transa\u00e7\u00e3o T n\u00e3o \u00e9 revertida como no m\u00e9todo dos timestamps.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Transa\u00e7\u00f5es e mecanismos de controle | ProHoster","description":"Uma Transa\u00e7\u00e3o \u00e9 uma sequ\u00eancia de opera\u00e7\u00f5es sobre dados que possui um in\u00edcio e um fim. Uma transa\u00e7\u00e3o \u00e9 a execu\u00e7\u00e3o sequencial de opera\u00e7\u00f5es de leitura e grava\u00e7\u00e3o.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/tranzaktsii-i-mehanizmy-ih-kontrolya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/30878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=30878"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30878\/revisions"}],"predecessor-version":[{"id":162008,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30878\/revisions\/162008"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=30878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=30878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=30878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}