{"id":1320,"date":"2026-06-29T18:22:06","date_gmt":"2026-06-29T21:22:06","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/"},"modified":"2026-06-29T18:22:06","modified_gmt":"2026-06-29T21:22:06","slug":"aula-14-transactions-commit-rollback-e-controle-de-concorren","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/","title":{"rendered":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia"},"content":{"rendered":"<p>Seja bem-vindo \u00e0 d\u00e9cima-quarta aula do curso <strong>MySQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Hoje mergulhamos em um dos conceitos mais fundamentais para qualquer profissional que trabalha com bancos de dados relacionais em ambientes de produ\u00e7\u00e3o: <strong>Transactions<\/strong>. Dominar o in\u00edcio, o desfecho e o cancelamento de uma opera\u00e7\u00e3o composta \u00e9 o que separa uma aplica\u00e7\u00e3o fr\u00e1gil de um sistema verdadeiramente confi\u00e1vel. Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, a utiliza\u00e7\u00e3o correta de transactions \u00e9 pr\u00e9-requisito inegoci\u00e1vel em qualquer pipeline de dados que envolva consist\u00eancia financeira, logs de auditoria ou sincroniza\u00e7\u00e3o entre m\u00faltiplos microsservi\u00e7os.<\/p>\n<p>Nesta aula, voc\u00ea vai al\u00e9m da sintaxe b\u00e1sica de <strong>COMMIT<\/strong> e <strong>ROLLBACK<\/strong>. Vamos entender o modelo transacional do MySQL, como o motor <strong>InnoDB<\/strong> implementa as propriedades <strong>ACID<\/strong> e de que forma o controle de concorr\u00eancia multivers\u00e3o (<strong>MVCC<\/strong>) permite que centenas de conex\u00f5es trabalhem simultaneamente sem corromper os dados. Voc\u00ea aprender\u00e1 a configurar e inspecionar o comportamento de transa\u00e7\u00f5es, manipular <strong>savepoints<\/strong> e diagnosticar problemas comuns de bloqueio e deadlock \u2014 tudo com exemplos pr\u00e1ticos que simulam cen\u00e1rios reais.<\/p>\n<p>Se voc\u00ea vem acompanhando o curso, j\u00e1 sabe criar bancos, tabelas com constraints e escrever consultas complexas. Agora, vai aprender a empacotar m\u00faltiplas instru\u00e7\u00f5es <strong>INSERT<\/strong>, <strong>UPDATE<\/strong> e <strong>DELETE<\/strong> em unidades at\u00f4micas, de modo que ou todas as mudan\u00e7as s\u00e3o persistidas ou nenhuma \u00e9. Veremos por que o modo <strong>autocommit<\/strong> padr\u00e3o pode ser um aliado perigoso e como desativ\u00e1-lo temporariamente para transa\u00e7\u00f5es expl\u00edcitas. Ao final, voc\u00ea ser\u00e1 capaz de implementar rotinas transacionais seguras e identificar rapidamente quando um bloqueio ou um n\u00edvel de isolamento inadequado est\u00e1 prejudicando a performance.<\/p>\n<p>Prepare seu terminal e seu cliente MySQL preferido. Todos os exemplos foram testados no <strong>MySQL 8.0<\/strong> e s\u00e3o compat\u00edveis com as vers\u00f5es <strong>5.7<\/strong> e posteriores que utilizam o mecanismo InnoDB. A aula est\u00e1 estruturada para ser executada passo a passo: cada comando mostrado deve funcionar se reproduzido exatamente como descrito. Vamos come\u00e7ar.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>O conceito de <strong>Transaction<\/strong> e sua import\u00e2ncia em sistemas de produ\u00e7\u00e3o<\/li>\n<li>As quatro propriedades <strong>ACID<\/strong> \u2014 Atomicidade, Consist\u00eancia, Isolamento e Durabilidade<\/li>\n<li>Como verificar e alterar o motor de armazenamento para <strong>InnoDB<\/strong><\/li>\n<li>Os comandos <strong>START TRANSACTION<\/strong>, <strong>COMMIT<\/strong> e <strong>ROLLBACK<\/strong> em detalhes<\/li>\n<li>Uso avan\u00e7ado de <strong>SAVEPOINT<\/strong> para rollback parcial<\/li>\n<li>Controle de concorr\u00eancia: locks de linha, locks de tabela e <strong>MVCC<\/strong><\/li>\n<li>Os quatro n\u00edveis de isolamento definidos pelo padr\u00e3o SQL e seu comportamento no MySQL<\/li>\n<li>Configura\u00e7\u00e3o de timeout de lock e detec\u00e7\u00e3o de deadlock<\/li>\n<li>Diagn\u00f3stico de transa\u00e7\u00f5es abertas com <strong>SHOW ENGINE INNODB STATUS<\/strong> e <strong>INFORMATION_SCHEMA<\/strong><\/li>\n<li>Erros comuns e estrat\u00e9gias de resolu\u00e7\u00e3o em ambientes de alta concorr\u00eancia<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para executar todos os procedimentos desta aula sem obst\u00e1culos, voc\u00ea precisa de um servidor MySQL em funcionamento. O recomendado \u00e9 o <strong>MySQL 8.0<\/strong> ou superior, por\u00e9m os comandos funcionam a partir da vers\u00e3o <strong>5.7<\/strong> desde que o motor padr\u00e3o seja o InnoDB. O ambiente foi validado em dois sistemas operacionais:<\/p>\n<ul>\n<li><strong>Ubuntu Server 22.04 LTS<\/strong> \u2014 MySQL instalado via <strong>apt<\/strong><\/li>\n<li><strong>Rocky Linux 9<\/strong> \u2014 MySQL instalado via <strong>dnf<\/strong> (reposit\u00f3rio oficial Oracle)<\/li>\n<\/ul>\n<p>Voc\u00ea precisar\u00e1 de um cliente de linha de comando (<strong>mysql<\/strong>), que j\u00e1 vem com a instala\u00e7\u00e3o do servidor ou do pacote <strong>mysql-client<\/strong>. Tenha tamb\u00e9m privil\u00e9gios de <strong>SUPER<\/strong> ou pelo menos permiss\u00e3o para criar bancos de dados, tabelas e consultar o <strong>INFORMATION_SCHEMA<\/strong>. Se voc\u00ea concluiu a Aula 13, seu ambiente j\u00e1 atende a esses requisitos. Caso utilize um usu\u00e1rio restrito, os comandos de consulta a status e vari\u00e1veis de sistema ainda funcionar\u00e3o normalmente.<\/p>\n<p>O banco de dados que utilizaremos nos exemplos se chamar\u00e1 <strong>curso_transactions<\/strong>. Para ambientes de produ\u00e7\u00e3o, recomendamos que voc\u00ea sempre isole os testes em bases separadas das aplica\u00e7\u00f5es reais \u2014 esta \u00e9 uma pr\u00e1tica padr\u00e3o em todas as implementa\u00e7\u00f5es que conduzimos na <strong>JRT Technology Solutions<\/strong>.<\/p>\n<h3>1. O que s\u00e3o Transactions e por que elas s\u00e3o essenciais<\/h3>\n<p>Uma <strong>Transaction<\/strong> \u00e9 uma sequ\u00eancia de uma ou mais opera\u00e7\u00f5es SQL que o banco de dados trata como uma unidade de trabalho indivis\u00edvel. Isso significa que, ao final da execu\u00e7\u00e3o, apenas dois desfechos s\u00e3o poss\u00edveis: todas as instru\u00e7\u00f5es s\u00e3o aplicadas com sucesso e os dados s\u00e3o persistidos em disco \u2014 opera\u00e7\u00e3o conhecida como <strong>COMMIT<\/strong> \u2014 ou toda e qualquer modifica\u00e7\u00e3o feita at\u00e9 aquele ponto \u00e9 desfeita \u2014 opera\u00e7\u00e3o chamada de <strong>ROLLBACK<\/strong>. Esse \u00e9 o princ\u00edpio da <strong>atomicidade<\/strong>, o &#8220;A&#8221; do acr\u00f4nimo ACID.<\/p>\n<p>Pense em uma transfer\u00eancia banc\u00e1ria cl\u00e1ssica: a conta de origem precisa ser debitada e a conta de destino precisa ser creditada. As duas opera\u00e7\u00f5es devem acontecer por completo ou n\u00e3o devem acontecer de forma alguma. Se o d\u00e9bito ocorrer mas o cr\u00e9dito falhar por uma exce\u00e7\u00e3o de rede ou constraint violada, o sistema financeiro ficaria inconsistente. Ao envolver ambas as instru\u00e7\u00f5es em uma \u00fanica transaction, garantimos que um <strong>ROLLBACK<\/strong> seja executado automaticamente em caso de falha, retornando o banco ao estado anterior ao in\u00edcio da opera\u00e7\u00e3o.<\/p>\n<p>Em sistemas modernos de e-commerce, log\u00edstica e ERPs, as transactions n\u00e3o s\u00f3 previnem inconsist\u00eancias como tamb\u00e9m definem os limites de visibilidade dos dados entre conex\u00f5es concorrentes. \u00c9 por meio delas que o MySQL decide quais vers\u00f5es de uma linha s\u00e3o vis\u00edveis para cada consulta, utilizando o mecanismo de <strong>MVCC (Multiversion Concurrency Control)<\/strong>. Isso ser\u00e1 detalhado na se\u00e7\u00e3o sobre n\u00edveis de isolamento.<\/p>\n<p>Ao longo dos anos, na <strong>JRT Technology Solutions<\/strong>, j\u00e1 recuperamos bases inteiras de clientes simplesmente porque suas aplica\u00e7\u00f5es n\u00e3o utilizavam transactions e um script de migra\u00e7\u00e3o falhou no meio do caminho \u2014 deixando tabelas com metade dos dados novos e metade dos antigos. Compreender a teoria e a pr\u00e1tica de transactions n\u00e3o \u00e9 um luxo: \u00e9 dever profissional de quem administra dados corporativos.<\/p>\n<h3>2. Propriedades ACID: os pilares da confiabilidade transacional<\/h3>\n<p>O padr\u00e3o <strong>ACID<\/strong> (Atomicity, Consistency, Isolation, Durability) define as quatro propriedades que um sistema de banco de dados deve satisfazer para que suas transa\u00e7\u00f5es sejam consideradas confi\u00e1veis. Embora o termo seja amplamente utilizado, \u00e9 comum que profissionais confundam o significado pr\u00e1tico de cada letra. Vamos destrinchar uma por uma e mape\u00e1-las para os recursos concretos do MySQL com InnoDB.<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin-bottom: 20px;\">\n<thead>\n<tr style=\"background-color: #f2f2f2;\">\n<th>Propriedade<\/th>\n<th>Significado<\/th>\n<th>Mecanismo no MySQL\/InnoDB<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Atomicidade<\/strong><\/td>\n<td>&#8220;Tudo ou nada&#8221;: uma transa\u00e7\u00e3o \u00e9 uma unidade at\u00f4mica que ou \u00e9 completamente executada ou n\u00e3o deixa efeito algum no banco<\/td>\n<td><strong>COMMIT<\/strong> \/ <strong>ROLLBACK<\/strong>, <strong>UNDO log<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Consist\u00eancia<\/strong><\/td>\n<td>A transa\u00e7\u00e3o leva o banco de um estado v\u00e1lido a outro estado v\u00e1lido, preservando todas as constraints, triggers e regras de integridade<\/td>\n<td><strong>Foreign keys<\/strong>, <strong>CHECK constraints<\/strong>, <strong>triggers<\/strong>, <strong>unique indexes<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Isolamento<\/strong><\/td>\n<td>Transa\u00e7\u00f5es concorrentes n\u00e3o interferem umas nas outras \u2014 os efeitos de uma transa\u00e7\u00e3o em andamento s\u00e3o invis\u00edveis para outras at\u00e9 o COMMIT<\/td>\n<td><strong>MVCC<\/strong>, <strong>locks de linha<\/strong>, <strong>n\u00edveis de isolamento<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Durabilidade<\/strong><\/td>\n<td>Uma vez confirmada, a transa\u00e7\u00e3o sobrevive a falhas de energia, crash do sistema ou qualquer outro evento catastr\u00f3fico<\/td>\n<td><strong>REDO log<\/strong>, <strong>doublewrite buffer<\/strong>, <strong>fsync<\/strong> em disco<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>O <strong>UNDO log<\/strong> \u00e9 o componente que permite o rollback e a leitura consistente sem bloqueios. Cada vez que uma linha \u00e9 modificada, a vers\u00e3o anterior \u00e9 copiada para o undo log. Assim, outras transa\u00e7\u00f5es podem continuar lendo a vers\u00e3o antiga enquanto a nova ainda n\u00e3o foi confirmada \u2014 caracter\u00edstica fundamental do MVCC. O <strong>REDO log<\/strong>, por sua vez, registra as modifica\u00e7\u00f5es antes mesmo que elas sejam aplicadas nos datafiles, garantindo a durabilidade em caso de crash.<\/p>\n<p>\u00c9 importante destacar que a garantia de consist\u00eancia n\u00e3o \u00e9 uma m\u00e1gica do motor: as constraints precisam ser definidas corretamente. Um banco sem foreign keys e sem triggers pode sofrer corrup\u00e7\u00e3o l\u00f3gica mesmo dentro de transa\u00e7\u00f5es ACID, pois a consist\u00eancia depende das regras de neg\u00f3cio que voc\u00ea implementa.<\/p>\n<h3>3. Preparando o ambiente: InnoDB e o modo autocommit<\/h3>\n<p>No MySQL, o suporte a transa\u00e7\u00f5es depende do motor de armazenamento. O <strong>MyISAM<\/strong>, por exemplo, n\u00e3o \u00e9 transacional. Para a imensa maioria dos cen\u00e1rios de produ\u00e7\u00e3o, o <strong>InnoDB<\/strong> \u00e9 o motor padr\u00e3o e o \u00fanico recomendado. Vamos come\u00e7ar verificando o ambiente e criando a base de testes.<\/p>\n<p>Conecte-se ao MySQL como usu\u00e1rio com privil\u00e9gios de cria\u00e7\u00e3o de banco de dados (por exemplo, <strong>root<\/strong>) e execute:<\/p>\n<pre><code>-- Conectando ao MySQL (execute no terminal do SO)\nmysql -u root -p\n\n-- Dentro do cliente MySQL, verifique o motor padr\u00e3o\nSHOW ENGINES \\G<\/code><\/pre>\n<p>A sa\u00edda ser\u00e1 extensa. Procure pela linha referente ao InnoDB. A coluna <strong>Support<\/strong> deve mostrar <strong>DEFAULT<\/strong> ou <strong>YES<\/strong>. Uma sa\u00edda t\u00edpica \u00e9:<\/p>\n<pre><code class=\"output\">*************************** 1. row ***************************\n      Engine: InnoDB\n     Support: DEFAULT\n     Comment: Supports transactions, row-level locking, and foreign keys\nTransactions: YES\n          XA: YES\n  Savepoints: YES\n*************************** 2. row ***************************\n      Engine: MyISAM\n     Support: YES\n     Comment: MyISAM storage engine\nTransactions: NO\n          XA: NO\n  Savepoints: NO\n...<\/code><\/pre>\n<p>As colunas <strong>Transactions<\/strong>, <strong>XA<\/strong> e <strong>Savepoints<\/strong> indicam se o motor suporta transa\u00e7\u00f5es, transa\u00e7\u00f5es distribu\u00eddas (XA) e savepoints, respectivamente. Se InnoDB n\u00e3o aparecer como DEFAULT, voc\u00ea pode alter\u00e1-lo permanentemente no arquivo de configura\u00e7\u00e3o ou apenas para a sess\u00e3o atual. Agora crie a base de testes e verifique o comportamento do <strong>autocommit<\/strong>:<\/p>\n<pre><code>-- Cria\u00e7\u00e3o do banco de dados de exemplo\nCREATE DATABASE IF NOT EXISTS curso_transactions;\nUSE curso_transactions;\n\n-- Cria\u00e7\u00e3o da tabela de contas para os exemplos de transfer\u00eancia\nCREATE TABLE contas (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    titular VARCHAR(100) NOT NULL,\n    saldo DECIMAL(10, 2) NOT NULL DEFAULT 0.00,\n    CONSTRAINT chk_saldo CHECK (saldo >= 0)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- Inser\u00e7\u00e3o de dados iniciais\nINSERT INTO contas (titular, saldo) VALUES\n    ('Alice', 1000.00),\n    ('Bob',   500.00),\n    ('Carlos', 250.00);\n\n-- Verificando o conte\u00fado\nSELECT * FROM contas;<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+---------+\n| id | titular | saldo   |\n+----+---------+---------+\n|  1 | Alice   | 1000.00 |\n|  2 | Bob     |  500.00 |\n|  3 | Carlos  |  250.00 |\n+----+---------+---------+\n3 rows in set (0.00 sec)<\/code><\/pre>\n<p>Agora, o ponto mais cr\u00edtico antes de come\u00e7armos com transa\u00e7\u00f5es expl\u00edcitas: o MySQL opera por padr\u00e3o com <strong>autocommit = ON<\/strong>. Isso significa que cada instru\u00e7\u00e3o SQL \u00e9 automaticamente tratada como uma transa\u00e7\u00e3o que sofre <strong>COMMIT<\/strong> ao final. Em outras palavras, um <strong>INSERT<\/strong> isolado j\u00e1 \u00e9 uma transa\u00e7\u00e3o completa. Para transa\u00e7\u00f5es de m\u00faltiplos passos, precisamos desligar esse comportamento ou usar o comando <strong>START TRANSACTION<\/strong>, que desabilita temporariamente o autocommit at\u00e9 o pr\u00f3ximo COMMIT ou ROLLBACK.<\/p>\n<pre><code>-- Verificando o estado atual de autocommit\nSHOW VARIABLES LIKE 'autocommit';<\/code><\/pre>\n<pre><code class=\"output\">+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| autocommit    | ON    |\n+---------------+-------+\n1 row in set (0.01 sec)<\/code><\/pre>\n<p>Nosso ambiente est\u00e1 pronto. A tabela <strong>contas<\/strong> usa InnoDB e temos dados para simular opera\u00e7\u00f5es reais.<\/p>\n<h3>4. Primeiros passos com START TRANSACTION, COMMIT e ROLLBACK<\/h3>\n<p>Este \u00e9 o n\u00facleo pr\u00e1tico da aula. Vamos simular uma transfer\u00eancia de R$ 200,00 de Alice para Bob. As opera\u00e7\u00f5es necess\u00e1rias s\u00e3o: debitar 200 da conta de Alice e creditar 200 na conta de Bob. Se ambas forem bem-sucedidas, confirmamos a transa\u00e7\u00e3o. Caso contr\u00e1rio, desfazemos tudo.<\/p>\n<p>Abra uma \u00fanica sess\u00e3o do MySQL (vamos cham\u00e1-la de Sess\u00e3o A) e execute os comandos passo a passo. Observe os coment\u00e1rios em linha.<\/p>\n<pre><code>-- 1. Inicia uma nova transa\u00e7\u00e3o explicitamente\nSTART TRANSACTION;\n\n-- 2. D\u00e9bito da conta de origem (Alice)\nUPDATE contas SET saldo = saldo - 200.00 WHERE id = 1;\n\n-- 3. Cr\u00e9dito na conta de destino (Bob)\nUPDATE contas SET saldo = saldo + 200.00 WHERE id = 2;\n\n-- 4. Verifica os saldos DENTRO da transa\u00e7\u00e3o ativa\nSELECT id, titular, saldo FROM contas WHERE id IN (1, 2);<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+---------+\n| id | titular | saldo   |\n+----+---------+---------+\n|  1 | Alice   |  800.00 |\n|  2 | Bob     |  700.00 |\n+----+---------+---------+\n2 rows in set (0.00 sec)<\/code><\/pre>\n<p>Dentro da mesma sess\u00e3o, os saldos refletem as altera\u00e7\u00f5es, mas elas <strong>n\u00e3o est\u00e3o vis\u00edveis<\/strong> para outras conex\u00f5es e ainda n\u00e3o foram persistidas em disco como parte dur\u00e1vel do banco. Se abrirmos uma segunda sess\u00e3o agora, ela ver\u00e1 os saldos originais. Verifique isso na pr\u00e1tica abrindo outro terminal e executando:<\/p>\n<pre><code>-- Sess\u00e3o B: verificar os saldos enquanto a transa\u00e7\u00e3o da Sess\u00e3o A est\u00e1 ativa\nUSE curso_transactions;\nSELECT id, titular, saldo FROM contas WHERE id IN (1, 2);<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+---------+\n| id | titular | saldo   |\n+----+---------+---------+\n|  1 | Alice   | 1000.00 |\n|  2 | Bob     |  500.00 |\n+----+---------+---------+\n2 rows in set (0.00 sec)<\/code><\/pre>\n<p>Isso comprova o isolamento padr\u00e3o (n\u00edvel <strong>REPEATABLE READ<\/strong>). Agora, na Sess\u00e3o A, voc\u00ea tem duas escolhas: confirmar com <strong>COMMIT<\/strong> ou desfazer com <strong>ROLLBACK<\/strong>. Vamos primeiro executar um ROLLBACK para ver o efeito:<\/p>\n<pre><code>-- Sess\u00e3o A: desfazendo todas as altera\u00e7\u00f5es\nROLLBACK;\n\n-- Verificando ap\u00f3s rollback\nSELECT id, titular, saldo FROM contas WHERE id IN (1, 2);<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+---------+\n| id | titular | saldo   |\n+----+---------+---------+\n|  1 | Alice   | 1000.00 |\n|  2 | Bob     |  500.00 |\n+----+---------+---------+\n2 rows in set (0.00 sec)<\/code><\/pre>\n<p>Os saldos retornaram ao estado original, e a Sess\u00e3o B tamb\u00e9m nunca viu os valores intermedi\u00e1rios. Agora, repita a opera\u00e7\u00e3o, mas desta vez execute <strong>COMMIT<\/strong>:<\/p>\n<pre><code>-- Sess\u00e3o A: nova transa\u00e7\u00e3o\nSTART TRANSACTION;\nUPDATE contas SET saldo = saldo - 200.00 WHERE id = 1;\nUPDATE contas SET saldo = saldo + 200.00 WHERE id = 2;\nCOMMIT;\n\nSELECT id, titular, saldo FROM contas WHERE id IN (1, 2);<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+---------+\n| id | titular | saldo   |\n+----+---------+---------+\n|  1 | Alice   |  800.00 |\n|  2 | Bob     |  700.00 |\n+----+---------+---------+\n2 rows in set (0.00 sec)<\/code><\/pre>\n<p>Agora, na Sess\u00e3o B, uma nova consulta confirmar\u00e1 os saldos atualizados. A transa\u00e7\u00e3o foi dur\u00e1vel. O mais importante: se entre o d\u00e9bito e o cr\u00e9dito ocorresse um erro \u2014 como uma viola\u00e7\u00e3o de constraint \u2014 o MySQL faria um rollback autom\u00e1tico, desde que a transa\u00e7\u00e3o estivesse ativa e o erro fosse tratado pela aplica\u00e7\u00e3o.<\/p>\n<h3>5. Savepoints: criando pontos de recupera\u00e7\u00e3o dentro de uma Transaction<\/h3>\n<p>Em cen\u00e1rios mais complexos, pode ser necess\u00e1rio reverter apenas uma parte da transa\u00e7\u00e3o, preservando o trabalho j\u00e1 realizado. Para isso, o padr\u00e3o SQL prev\u00ea os <strong>SAVEPOINTs<\/strong>, que funcionam como marcadores nomeados dentro de uma transa\u00e7\u00e3o ativa. Voc\u00ea pode criar m\u00faltiplos savepoints e retornar a qualquer um deles sem desfazer a transa\u00e7\u00e3o inteira.<\/p>\n<p>Vamos simular uma opera\u00e7\u00e3o que envolve tr\u00eas atualiza\u00e7\u00f5es: debitar Alice, creditar Bob e creditar Carlos. No meio do processo, um savepoint permite voltar atr\u00e1s apenas na terceira etapa.<\/p>\n<pre><code>-- Sess\u00e3o A: iniciando transa\u00e7\u00e3o com savepoints\nSTART TRANSACTION;\n\n-- Primeira etapa: d\u00e9bito de Alice\nUPDATE contas SET saldo = saldo - 100.00 WHERE id = 1;\nSAVEPOINT sp_debito_alice;   -- marcador 1\n\n-- Segunda etapa: cr\u00e9dito para Bob\nUPDATE contas SET saldo = saldo + 60.00 WHERE id = 2;\nSAVEPOINT sp_credito_bob;    -- marcador 2\n\n-- Terceira etapa: cr\u00e9dito para Carlos (vamos supor que algo deu errado)\nUPDATE contas SET saldo = saldo + 40.00 WHERE id = 3;\n\n-- Verificando os saldos parciais\nSELECT id, titular, saldo FROM contas ORDER BY id;<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+--------+\n| id | titular | saldo  |\n+----+---------+--------+\n|  1 | Alice   | 700.00 |\n|  2 | Bob     | 760.00 |\n|  3 | Carlos  | 290.00 |\n+----+---------+--------+\n3 rows in set (0.00 sec)<\/code><\/pre>\n<p>Agora, imagine que voc\u00ea decidiu que o cr\u00e9dito para Carlos foi incorreto, mas o d\u00e9bito de Alice e o cr\u00e9dito para Bob devem ser mantidos. Em vez de desfazer tudo com ROLLBACK, voc\u00ea pode retornar ao savepoint <strong>sp_credito_bob<\/strong>:<\/p>\n<pre><code>-- Retorna ao ponto imediatamente ap\u00f3s o cr\u00e9dito para Bob\nROLLBACK TO SAVEPOINT sp_credito_bob;\n\n-- Verificando ap\u00f3s rollback parcial\nSELECT id, titular, saldo FROM contas ORDER BY id;<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+--------+\n| id | titular | saldo  |\n+----+---------+--------+\n|  1 | Alice   | 700.00 |\n|  2 | Bob     | 760.00 |\n|  3 | Carlos  | 250.00 |\n+----+---------+--------+\n3 rows in set (0.00 sec)<\/code><\/pre>\n<p>Carlos voltou ao saldo original (250), enquanto Alice e Bob mantiveram as altera\u00e7\u00f5es. Voc\u00ea pode liberar savepoints quando n\u00e3o forem mais necess\u00e1rios usando <strong>RELEASE SAVEPOINT nome;<\/strong>. Se quiser desfazer toda a transa\u00e7\u00e3o, um <strong>ROLLBACK<\/strong> simples (sem o TO) ainda funciona. Finalize com COMMIT para persistir as mudan\u00e7as restantes.<\/p>\n<pre><code>COMMIT;<\/code><\/pre>\n<p>Na <strong>JRT Technology Solutions<\/strong>, utilizamos savepoints extensivamente em rotinas de ETL e migra\u00e7\u00e3o de dados. Eles oferecem uma forma elegante de realizar rollback granular, especialmente quando um bloco de 50 instru\u00e7\u00f5es pode falhar na 47\u00aa e voc\u00ea n\u00e3o quer repetir o processamento das 46 anteriores.<\/p>\n<h3>6. Controle de concorr\u00eancia: Locks e n\u00edveis de isolamento em Transactions<\/h3>\n<p>Um dos maiores desafios em bancos de dados transacionais \u00e9 equilibrar consist\u00eancia e performance quando m\u00faltiplas conex\u00f5es tentam ler e modificar as mesmas linhas simultaneamente. O MySQL com InnoDB aborda isso com dois mecanismos complementares: <strong>locks<\/strong> (bloqueios) e <strong>MVCC<\/strong> (controle de concorr\u00eancia multivers\u00e3o).<\/p>\n<p>O InnoDB implementa bloqueios de linha (<strong>row-level locking<\/strong>) para opera\u00e7\u00f5es de modifica\u00e7\u00e3o. Quando um <strong>UPDATE<\/strong> ou <strong>DELETE<\/strong> \u00e9 executado dentro de uma transa\u00e7\u00e3o, as linhas afetadas recebem um <strong>exclusive lock (X)<\/strong>. Outras transa\u00e7\u00f5es n\u00e3o podem escrever nessas linhas at\u00e9 que a primeira libere o lock com COMMIT ou ROLLBACK. Para leitura, \u00e9 poss\u00edvel usar <strong>SELECT &#8230; FOR UPDATE<\/strong> (lock exclusivo) ou <strong>SELECT &#8230; LOCK IN SHARE MODE<\/strong> (lock compartilhado, renomeado para <strong>FOR SHARE<\/strong> no MySQL 8.0).<\/p>\n<p>O MVCC, por outro lado, permite que leituras consistentes sejam feitas sem locks, usando snapshots dos dados no momento em que a transa\u00e7\u00e3o come\u00e7ou. O comportamento exato depende do <strong>n\u00edvel de isolamento<\/strong> configurado. O MySQL suporta quatro n\u00edveis, conforme o padr\u00e3o SQL:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin-bottom: 20px;\">\n<thead>\n<tr style=\"background-color: #f2f2f2;\">\n<th>N\u00edvel de Isolamento<\/th>\n<th>Dirty Read<\/th>\n<th>Non-Repeatable Read<\/th>\n<th>Phantom Read<\/th>\n<th>Padr\u00e3o no MySQL?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>READ UNCOMMITTED<\/strong><\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<td>N\u00e3o<\/td>\n<\/tr>\n<tr>\n<td><strong>READ COMMITTED<\/strong><\/td>\n<td>N\u00e3o<\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<td>N\u00e3o (padr\u00e3o em PostgreSQL, Oracle)<\/td>\n<\/tr>\n<tr>\n<td><strong>REPEATABLE READ<\/strong><\/td>\n<td>N\u00e3o<\/td>\n<td>N\u00e3o<\/td>\n<td>Parcialmente (MySQL evita com gap locks)<\/td>\n<td>Sim (padr\u00e3o no MySQL\/InnoDB)<\/td>\n<\/tr>\n<tr>\n<td><strong>SERIALIZABLE<\/strong><\/td>\n<td>N\u00e3o<\/td>\n<td>N\u00e3o<\/td>\n<td>N\u00e3o<\/td>\n<td>N\u00e3o<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Vamos testar o <strong>REPEATABLE READ<\/strong> na pr\u00e1tica com duas sess\u00f5es concorrentes:<\/p>\n<pre><code>-- Sess\u00e3o A: verificar o n\u00edvel de isolamento e iniciar uma transa\u00e7\u00e3o\nSELECT @@transaction_isolation;  -- Deve retornar REPEATABLE-READ\nSTART TRANSACTION;\nSELECT id, titular, saldo FROM contas WHERE id = 1;  -- Alice tem 700.00 neste snapshot<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+--------+\n| id | titular | saldo  |\n+----+---------+--------+\n|  1 | Alice   | 700.00 |\n+----+---------+--------+\n1 row in set (0.00 sec)<\/code><\/pre>\n<pre><code>-- Sess\u00e3o B: atualiza Alice e comita\nUPDATE contas SET saldo = 999.99 WHERE id = 1;\nCOMMIT;<\/code><\/pre>\n<pre><code>-- Sess\u00e3o A: l\u00ea novamente a mesma linha\nSELECT id, titular, saldo FROM contas WHERE id = 1;<\/code><\/pre>\n<pre><code class=\"output\">+----+---------+--------+\n| id | titular | saldo  |\n+----+---------+--------+\n|  1 | Alice   | 700.00 |\n+----+---------+--------+\n1 row in set (0.00 sec)<\/code><\/pre>\n<p>Mesmo ap\u00f3s o COMMIT na Sess\u00e3o B, a Sess\u00e3o A continua enxergando o saldo de 700.00 \u2014 o snapshot consistente da transa\u00e7\u00e3o ativa. Esse comportamento garante leituras repet\u00edveis e \u00e9 exatamente o que se espera do n\u00edvel <strong>REPEATABLE READ<\/strong>. Se voc\u00ea precisar enxergar dados confirmados por outras transa\u00e7\u00f5es durante a sua, mude para <strong>READ COMMITTED<\/strong>:<\/p>\n<pre><code>-- Em ambas as sess\u00f5es, altere o n\u00edvel de isolamento para a transa\u00e7\u00e3o atual\nSET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;<\/code><\/pre>\n<p>Refa\u00e7a o teste: na Sess\u00e3o A, ap\u00f3s o COMMIT da Sess\u00e3o B, uma nova leitura retornar\u00e1 999.99. Isso elimina o non-repeatable read, mas reintroduz o phantom read e reduz o isolamento geral, algo que deve ser avaliado cuidadosamente em ambientes financeiros.<\/p>\n<h3>7. Configura\u00e7\u00e3o e personaliza\u00e7\u00e3o do comportamento transacional<\/h3>\n<p>O MySQL exp\u00f5e diversas vari\u00e1veis de sistema que controlam aspectos transacionais. Al\u00e9m do <strong>autocommit<\/strong> e do <strong>transaction_isolation<\/strong>, temos par\u00e2metros cr\u00edticos para cen\u00e1rios de alta concorr\u00eancia e volume. As principais est\u00e3o resumidas na tabela a seguir, e podem ser configuradas dinamicamente ou no arquivo de configura\u00e7\u00e3o do servidor.<\/p>\n<p>Em sistemas Linux, o arquivo principal \u00e9 <strong>\/etc\/mysql\/mysql.conf.d\/mysqld.cnf<\/strong> (Ubuntu\/Debian) ou <strong>\/etc\/my.cnf<\/strong> (Rocky Linux\/CentOS). Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, sempre adicionamos um bloco espec\u00edfico para tuning transacional no grupo <strong>[mysqld]<\/strong>. Abaixo, um exemplo funcional de configura\u00e7\u00e3o:<\/p>\n<pre><code># \/etc\/mysql\/mysql.conf.d\/mysqld.cnf (Ubuntu 22.04)\n# ou \/etc\/my.cnf (Rocky Linux 9)\n\n[mysqld]\n# N\u00edvel de isolamento padr\u00e3o para todas as conex\u00f5es\ntransaction-isolation = READ-COMMITTED\n\n# Desabilita autocommit por padr\u00e3o (exige START TRANSACTION em cada conex\u00e3o)\nautocommit = 0\n\n# Tempo m\u00e1ximo (em segundos) que uma transa\u00e7\u00e3o pode esperar por um lock de linha\ninnodb_lock_wait_timeout = 50\n\n# Habilita a detec\u00e7\u00e3o autom\u00e1tica de deadlock (altamente recomendado)\ninnodb_deadlock_detect = ON\n\n# Tamanho do buffer para o undo log (relevante para transa\u00e7\u00f5es longas)\ninnodb_undo_log_truncate = ON\ninnodb_max_undo_log_size = 2G<\/code><\/pre>\n<p>O par\u00e2metro <strong>innodb_lock_wait_timeout<\/strong> \u00e9 crucial. Se uma transa\u00e7\u00e3o tentar modificar uma linha que est\u00e1 bloqueada por outra, ela aguardar\u00e1 at\u00e9 esse timeout em segundos antes de desistir e lan\u00e7ar um erro de <strong>Lock wait timeout<\/strong>. O valor padr\u00e3o \u00e9 50 segundos. Em sistemas com alta taxa de requisi\u00e7\u00f5es, valores menores (10-20s) podem ser apropriados para evitar filas de conex\u00f5es bloqueadas. A detec\u00e7\u00e3o de deadlock, por sua vez, \u00e9 ativada por padr\u00e3o e deve permanecer ligada \u2014 o InnoDB consegue identificar ciclos de espera e resolver rompendo uma das transa\u00e7\u00f5es envolvidas automaticamente.<\/p>\n<p>Para aplicar as altera\u00e7\u00f5es sem reiniciar o servidor, voc\u00ea pode modificar vari\u00e1veis din\u00e2micas (algumas requerem privil\u00e9gio SUPER):<\/p>\n<pre><code>-- Alterando o timeout de lock dinamicamente (vale para novas conex\u00f5es)\nSET GLOBAL innodb_lock_wait_timeout = 20;\n\n-- Alterando o n\u00edvel de isolamento global (requer SUPER)\nSET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;<\/code><\/pre>\n<h3>8. Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Ap\u00f3s modificar quaisquer par\u00e2metros transacionais, \u00e9 obrigat\u00f3rio validar que o ambiente est\u00e1 se comportando como esperado. Execute os comandos abaixo em sequ\u00eancia e compare as sa\u00eddas.<\/p>\n<pre><code>-- 1. Verificar se o InnoDB est\u00e1 ativo e \u00e9 o motor padr\u00e3o\nSELECT engine, support, transactions\nFROM information_schema.engines\nWHERE engine = 'InnoDB';<\/code><\/pre>\n<pre><code class=\"output\">+--------+---------+--------------+\n| engine | support | transactions |\n+--------+---------+--------------+\n| InnoDB | DEFAULT | YES          |\n+--------+---------+--------------+\n1 row in set (0.01 sec)<\/code><\/pre>\n<pre><code>-- 2. Verificar o estado global de autocommit e n\u00edvel de isolamento\nSHOW GLOBAL VARIABLES LIKE 'autocommit';\nSHOW GLOBAL VARIABLES LIKE 'transaction_isolation';<\/code><\/pre>\n<pre><code class=\"output\">+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| autocommit    | ON    |\n+---------------+-------+\n1 row in set (0.00 sec)\n\n+-----------------------+-----------------+\n| Variable_name         | Value           |\n+-----------------------+-----------------+\n| transaction_isolation | REPEATABLE-READ |\n+-----------------------+-----------------+\n1 row in set (0.00 sec)<\/code><\/pre>\n<pre><code>-- 3. Listar transa\u00e7\u00f5es ativas no momento (\u00fatil em produ\u00e7\u00e3o)\nSELECT trx_id, trx_state, trx_started,\n       trx_requested_lock_id,\n       trx_mysql_thread_id,\n       trx_query\nFROM information_schema.innodb_trx;<\/code><\/pre>\n<pre><code class=\"output\">Empty set (0.00 sec)<\/code><\/pre>\n<p>A consulta \u00e0 tabela <strong>innodb_trx<\/strong> \u00e9 sua principal ferramenta de diagn\u00f3stico de transa\u00e7\u00f5es em andamento. Em um ambiente sem transa\u00e7\u00f5es abertas, o retorno deve ser vazio. Se houver alguma listada, as colunas indicam o identificador da transa\u00e7\u00e3o, o estado (<strong>RUNNING<\/strong>, <strong>LOCK WAIT<\/strong>, <strong>ROLLING BACK<\/strong>) e a thread associada \u2014 informa\u00e7\u00e3o essencial para matar processos travados com <strong>KILL thread_id<\/strong>.<\/p>\n<pre><code>-- 4. Teste pr\u00e1tico de rollback autom\u00e1tico por viola\u00e7\u00e3o de constraint\n-- Vamos tentar debitar um valor que torne o saldo negativo (nossa constraint impede)\nSTART TRANSACTION;\nUPDATE contas SET saldo = saldo - 2000.00 WHERE id = 1;\n-- O erro ocorrer\u00e1 aqui e a transa\u00e7\u00e3o ser\u00e1 marcada como inv\u00e1lida<\/code><\/pre>\n<pre><code class=\"output\">ERROR 3819 (HY000): Check constraint 'chk_saldo' is violated.<\/code><\/pre>\n<pre><code>-- Agora, qualquer comando diferente de ROLLBACK ou COMMIT falhar\u00e1\nUPDATE contas SET saldo = 100.00 WHERE id = 1;<\/code><\/pre>\n<pre><code class=\"output\">ERROR 1305 (42000): SAVEPOINT does not exist<\/code><\/pre>\n<pre><code>-- Voc\u00ea deve explicitamente reverter a transa\u00e7\u00e3o\nROLLBACK;\nSELECT saldo FROM contas WHERE id = 1;  -- retorna ao valor anterior<\/code><\/pre>\n<pre><code class=\"output\">+---------+\n| saldo   |\n+---------+\n|  700.00 |\n+---------+\n1 row in set (0.00 sec)<\/code><\/pre>\n<p>Esse teste confirma o funcionamento da atomicidade e das constraints. Seu ambiente est\u00e1 validado.<\/p>\n<h3>9. Erros Comuns e Como Resolver<\/h3>\n<p>Ao trabalhar com transactions no MySQL, alguns erros aparecem com frequ\u00eancia, especialmente em equipes que est\u00e3o migrando de ambientes n\u00e3o transacionais ou ajustando o n\u00edvel de isolamento pela primeira vez. Abaixo, os quatro erros mais comuns que encontramos em campo na <strong>JRT Technology Solutions<\/strong> e como resolv\u00ea-los de forma definitiva.<\/p>\n<ul>\n<li>\n    <strong>Erro: &#8220;Lock wait timeout exceeded; try restarting transaction&#8221;<\/strong><br \/>\n    <strong>Causa:<\/strong> Uma transa\u00e7\u00e3o aguardou mais que <strong>innodb_lock_wait_timeout<\/strong> segundos tentando adquirir um lock de linha que pertence a outra transa\u00e7\u00e3o.<br \/>\n    <strong>Sintoma:<\/strong> A consulta fica &#8220;travada&#8221; no cliente e, ap\u00f3s o timeout, retorna o erro. As demais conex\u00f5es podem acumular na fila de locks.<br \/>\n    <strong>Solu\u00e7\u00e3o:<\/strong> Identifique a transa\u00e7\u00e3o bloqueadora com <strong>SELECT * FROM information_schema.innodb_trx WHERE trx_state = &#8216;RUNNING&#8217;;<\/strong>. Encontre a thread correspondente e, se necess\u00e1rio, execute <strong>KILL &lt;thread_id&gt;<\/strong>. Revise a l\u00f3gica da aplica\u00e7\u00e3o para reduzir a dura\u00e7\u00e3o das transa\u00e7\u00f5es e considere diminuir o timeout em ambientes de alta rotatividade.\n  <\/li>\n<li>\n    <strong>Erro: &#8220;Deadlock found when trying to get lock; try restarting transaction&#8221;<\/strong><br \/>\n    <strong>Causa:<\/strong> Duas ou mais transa\u00e7\u00f5es est\u00e3o esperando mutuamente por locks que a outra possui. O InnoDB detecta o ciclo e escolhe uma &#8220;v\u00edtima&#8221; para ROLLBACK autom\u00e1tico.<br \/>\n    <strong>Sintoma:<\/strong> Uma das sess\u00f5es recebe o erro imediatamente, enquanto a outra prossegue normalmente. Afeta mais sistemas com ORMs que geram consultas complexas.<br \/>\n    <strong>Solu\u00e7\u00e3o:<\/strong> Obtenha o relat\u00f3rio do \u00faltimo deadlock com <strong>SHOW ENGINE INNODB STATUS \\G<\/strong> e procure a se\u00e7\u00e3o <strong>LATEST DETECTED DEADLOCK<\/strong>. Ele mostra as queries envolvidas e os locks. A corre\u00e7\u00e3o geralmente est\u00e1 em padronizar a ordem de acesso \u00e0s tabelas (ex: sempre atualizar tabelas na mesma sequ\u00eancia) e adicionar \u00edndices adequados para evitar lock de gap desnecess\u00e1rio.\n  <\/li>\n<li>\n    <strong>Erro: &#8220;Transaction already rolled back&#8221; ou comportamento inesperado ap\u00f3s viola\u00e7\u00e3o de constraint<\/strong><br \/>\n    <strong>Causa:<\/strong> Ap\u00f3s um erro dentro de uma transa\u00e7\u00e3o ativa, tentativas de executar novas instru\u00e7\u00f5es sem antes fazer ROLLBACK resultam em falha.<br \/>\n    <strong>Sintoma:<\/strong> C\u00f3digos de aplica\u00e7\u00e3o que capturam exce\u00e7\u00f5es e tentam continuar na mesma transa\u00e7\u00e3o geram o erro <strong>1305<\/strong>.<br \/>\n    <strong>Solu\u00e7\u00e3o:<\/strong> Sempre, ap\u00f3s capturar um erro em uma transaction, execute <strong>ROLLBACK<\/strong> expl\u00edcito antes de qualquer nova opera\u00e7\u00e3o. Em algumas linguagens (PHP, Python), \u00e9 comum esquecer de chamar rollback no bloco <strong>except<\/strong>, mantendo a conex\u00e3o em estado inconsistente.\n  <\/li>\n<li>\n    <strong>Erro: &#8220;Transactions n\u00e3o est\u00e3o funcionando&#8221; \u2014 tabelas criadas com MyISAM<\/strong><br \/>\n    <strong>Causa:<\/strong> O motor MyISAM n\u00e3o oferece suporte a transa\u00e7\u00f5es. Comandos como START TRANSACTION e ROLLBACK s\u00e3o ignorados sem erro.<br \/>\n    <strong>Sintoma:<\/strong> Updates s\u00e3o persistidos imediatamente, independentemente de COMMIT ou ROLLBACK, e o comando SHOW TABLE STATUS mostra Engine=MyISAM.<br \/>\n    <strong>Solu\u00e7\u00e3o:<\/strong> Converta a tabela com <strong>ALTER TABLE nome_tabela ENGINE=InnoDB;<\/strong>. Para evitar o problema em novas tabelas, defina <strong>default_storage_engine=InnoDB<\/strong> no arquivo de configura\u00e7\u00e3o. Em nossos deploys na JRT Technology Solutions, sempre verificamos o motor antes de liberar o schema para produ\u00e7\u00e3o.\n  <\/li>\n<\/ul>\n<h3>10. Boas Pr\u00e1ticas e Dicas Avan\u00e7adas<\/h3>\n<p>Com frequ\u00eancia, vemos equipes que dominam a sintaxe de <strong>COMMIT<\/strong> e <strong>ROLLBACK<\/strong> mas cometem deslizes de design que transformam transactions em gargalos severos. A primeira regra de ouro \u00e9: <strong>mantenha suas transa\u00e7\u00f5es t\u00e3o curtas quanto poss\u00edvel<\/strong>. Locks mantidos por longos per\u00edodos (especialmente durante pausas para I\/O externo, chamadas a APIs ou intera\u00e7\u00e3o com usu\u00e1rio) s\u00e3o a causa n\u00famero um de problemas de concorr\u00eancia. Em sistemas web, uma transa\u00e7\u00e3o deve come\u00e7ar e terminar dentro do mesmo request, sem depender de input humano entre o START e o COMMIT.<\/p>\n<p>A segunda pr\u00e1tica essencial \u00e9 escolher o n\u00edvel de isolamento adequado para cada caso de uso. O padr\u00e3o <strong>REPEATABLE READ<\/strong> \u00e9 seguro e adequado para a maioria das aplica\u00e7\u00f5es, mas pode gerar locks de gap excessivos em tabelas com alta frequ\u00eancia de inserts. Se sua aplica\u00e7\u00e3o tolera leituras n\u00e3o repet\u00edveis e voc\u00ea identificou conten\u00e7\u00e3o, migre para <strong>READ COMMITTED<\/strong> \u2014 mas esteja ciente dos phantoms reads e considere usar <strong>SELECT &#8230; FOR UPDATE<\/strong> quando precisar de consist\u00eancia em m\u00faltiplas leituras.<\/p>\n<p>A terceira dica vem diretamente da nossa experi\u00eancia na <strong>JRT Technology Solutions<\/strong>: implemente um mecanismo de retry autom\u00e1tico em sua aplica\u00e7\u00e3o para erros de deadlock e lock wait timeout. Como o MySQL j\u00e1 faz rollback da transa\u00e7\u00e3o v\u00edtima, a aplica\u00e7\u00e3o pode simplesmente capturar o erro, aguardar um intervalo aleat\u00f3rio (backoff exponencial) e reexecutar toda a transa\u00e7\u00e3o. Isso torna o sistema resiliente a picos de concorr\u00eancia sem interven\u00e7\u00e3o humana.<\/p>\n<p>Por fim, invista em monitoramento proativo. Consulte periodicamente as tabelas <strong>information_schema.innodb_trx<\/strong> e <strong>information_schema.innodb_lock_waits<\/strong> (esta \u00faltima obsoleta no MySQL 8.0 em favor de <strong>performance_schema.data_locks<\/strong> e <strong>data_lock_waits<\/strong>) para detectar transa\u00e7\u00f5es com dura\u00e7\u00e3o an\u00f4mala. Configure alertas para transa\u00e7\u00f5es com mais de N segundos de vida. Em ambientes de miss\u00e3o cr\u00edtica, um simples SELECT travado em lock wait pode derrubar toda a aplica\u00e7\u00e3o se n\u00e3o houver visibilidade.<\/p>\n<h3>Resumo da Aula 14<\/h3>\n<p>Nesta aula extensa, voc\u00ea aprendeu que <strong>Transactions<\/strong> s\u00e3o o mecanismo fundamental para garantir a consist\u00eancia dos dados em um banco relacional. Exploramos a implementa\u00e7\u00e3o das propriedades <strong>ACID<\/strong> no MySQL com InnoDB, desde o papel dos logs UNDO e REDO at\u00e9 o controle de concorr\u00eancia via MVCC. Voc\u00ea executou na pr\u00e1tica os comandos <strong>START TRANSACTION<\/strong>, <strong>COMMIT<\/strong>, <strong>ROLLBACK<\/strong> e <strong>SAVEPOINT<\/strong>, em cen\u00e1rios simulados que reproduzem situa\u00e7\u00f5es reais de desenvolvimento.<\/p>\n<p>Discutimos os n\u00edveis de isolamento e como eles afetam a visibilidade dos dados entre conex\u00f5es, com testes comparativos entre <strong>REPEATABLE READ<\/strong> e <strong>READ COMMITTED<\/strong>. Voc\u00ea configurou par\u00e2metros transacionais no arquivo <strong>my.cnf<\/strong> e aprendeu a verificar transa\u00e7\u00f5es ativas, diagnosticar deadlocks e resolver os quatro erros mais comuns em produ\u00e7\u00e3o. Ao final, solidificamos as boas pr\u00e1ticas que separam um DBA ou desenvolvedor que usa o MySQL de quem realmente entende seu comportamento transacional.<\/p>\n<p>A tabela abaixo resume os comandos principais que voc\u00ea deve ter internalizado ap\u00f3s esta aula:<\/p\n\n\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de MySQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20MySQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!<\/p>\n","protected":false},"author":1,"featured_media":1319,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":1,"footnotes":""},"categories":[75],"tags":[1743,2207,2063,120,2206,241],"class_list":["post-1320","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-banco-de-dados","tag-commit-rollback","tag-controle-de-concorrencia","tag-mysql","tag-transacoes-mysql","tag-tutorial-mysql"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thiago Paes Rodrigues\"\/>\n\t<meta name=\"google-site-verification\" content=\"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_BR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"100\" \/>\n\t\t<meta property=\"og:image:height\" content=\"75\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-06-29T21:22:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-06-29T21:22:06+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61590814880509\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#blogposting\",\"name\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia\",\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/ai-image-1782768109829.jpg\",\"width\":1024,\"height\":1024,\"caption\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia\"},\"datePublished\":\"2026-06-29T18:22:06-03:00\",\"dateModified\":\"2026-06-29T18:22:06-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#webpage\"},\"articleSection\":\"DevOps, banco de dados, COMMIT ROLLBACK, controle de concorr\\u00eancia, MySQL, transa\\u00e7\\u00f5es MySQL, tutorial mysql\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#listItem\",\"name\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#listItem\",\"position\":3,\"name\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"telephone\":\"+552138277513\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-logo-mini.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61590814880509\",\"https:\\\/\\\/www.instagram.com\\\/jrtx.tech\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/\",\"name\":\"Thiago Paes Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#authorImage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/cropped-foto-rascunho3-96x96.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/\",\"name\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia - BLOG - JRT Technology Solutions\",\"description\":\"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\\u00eancia. Domine o banco de dados do zero ao avan\\u00e7ado! Clique e confira!\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/ai-image-1782768109829.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#mainImage\",\"width\":1024,\"height\":1024,\"caption\":\"Aula 14: Transactions \\u2014 COMMIT, ROLLBACK e controle de concorr\\u00eancia\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/06\\\/29\\\/aula-14-transactions-commit-rollback-e-controle-de-concorren\\\/#mainImage\"},\"datePublished\":\"2026-06-29T18:22:06-03:00\",\"dateModified\":\"2026-06-29T18:22:06-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"alternateName\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"inLanguage\":\"pt-BR\",\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions","description":"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#blogposting","name":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions","headline":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia","author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/06\/ai-image-1782768109829.jpg","width":1024,"height":1024,"caption":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia"},"datePublished":"2026-06-29T18:22:06-03:00","dateModified":"2026-06-29T18:22:06-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#webpage"},"articleSection":"DevOps, banco de dados, COMMIT ROLLBACK, controle de concorr\u00eancia, MySQL, transa\u00e7\u00f5es MySQL, tutorial mysql"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","position":1,"name":"Home","item":"https:\/\/jrtx.com.br\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","position":2,"name":"DevOps","item":"https:\/\/jrtx.com.br\/blog\/category\/devops\/","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#listItem","name":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#listItem","position":3,"name":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia","previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}}]},{"@type":"Organization","@id":"https:\/\/jrtx.com.br\/blog\/#organization","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","url":"https:\/\/jrtx.com.br\/blog\/","telephone":"+552138277513","logo":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61590814880509","https:\/\/www.instagram.com\/jrtx.tech\/"]},{"@type":"Person","@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author","url":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/","name":"Thiago Paes Rodrigues","image":{"@type":"ImageObject","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#authorImage","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/cropped-foto-rascunho3-96x96.jpeg","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/","name":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions","description":"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#breadcrumblist"},"author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"creator":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/06\/ai-image-1782768109829.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#mainImage","width":1024,"height":1024,"caption":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/#mainImage"},"datePublished":"2026-06-29T18:22:06-03:00","dateModified":"2026-06-29T18:22:06-03:00"},{"@type":"WebSite","@id":"https:\/\/jrtx.com.br\/blog\/#website","url":"https:\/\/jrtx.com.br\/blog\/","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","alternateName":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","inLanguage":"pt-BR","publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"}}]},"og:locale":"pt_BR","og:site_name":"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","og:type":"article","og:title":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions","og:description":"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/","og:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:secure_url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:width":100,"og:image:height":75,"article:published_time":"2026-06-29T21:22:06+00:00","article:modified_time":"2026-06-29T21:22:06+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia - BLOG - JRT Technology Solutions","twitter:description":"Aprenda sobre Transactions em MySQL: COMMIT, ROLLBACK e controle de concorr\u00eancia. Domine o banco de dados do zero ao avan\u00e7ado! Clique e confira!","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":{"post_id":"1320","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_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":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_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"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,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-06-29 21:24:12","updated":"2026-06-29 21:24:12","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\/category\/devops\/\" title=\"DevOps\">DevOps<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/jrtx.com.br\/blog"},{"label":"DevOps","link":"https:\/\/jrtx.com.br\/blog\/category\/devops\/"},{"label":"Aula 14: Transactions \u2014 COMMIT, ROLLBACK e controle de concorr\u00eancia","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/29\/aula-14-transactions-commit-rollback-e-controle-de-concorren\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1320"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1320\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1319"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}