O que são transações e como usar os comandos Begin, Commit e Rollback
Tutorial que mostra passo a passo como funcionam as transações em banco de dados, o processo de confirmação e cancelamento de uma instrução SQL.
Índice deste artigo
Transações são unidades lógicas que ocorrem em operações de banco de dados e são responsáveis por manter a consistência, isolamento, coerência e durabilidade dos dados. Sem as transações corre-se o risco de termos dados inconsistentes o que tornaria duvidoso ou questionável qualquer operação de banco e dados.
Imagine uma transação bancária. Você vai a um caixa eletrônico e faz uma transferência de determinado valor da sua conta para a conta de outra pessoa. Depois de você informar o valor e os dados da conta que irá receber o crédito, pelo menos duas operações importantes serão realizadas no banco:
- 1º – Debitar o valor da sua conta
- 2º – Creditar o valor na conta destinatária
Mas, e se entre a operação 1 e 2 houver uma falha e o sistema parar justamente no meio? O valor será debitado e não será creditado, certo? Para evitar esse problema existe as transações.
Uma transação poderá ser implícita ou explicita.
Transação implícita
A transação implícita inicia quando um dos seguintes comandos são executados: Insert, Update, Delete, Create, Drop, Alter, entre outros.
Transação explícita
A transação explicita é iniciada pelo comando Begin transaction e é encerrada por um dos seguintes comandos:
- Commit. Confirma os dados alterados
- Rollback. Desfaz os dados alterados.
Exemplos de transações
Primeiro, criaremos uma tabela com a seguinte estrutura:
create table contas(
numero varchar(50),
debito decimal(10,2),
credito decimal(10,2)
)
Exemplo de Rollback
Após criar a tabela, a transação será iniciada e um registro será inserido:
begin transaction
insert into contas values('500-x',80,0)
Feito isso, vou executar três instruções em seguida, sendo um deles o comando Rollback para desfazer o insert.
select * from contas
rollback
select * from contas
O resultado será:
Perceba que o primeiro select mostrou que o registro havia sido feito e o segundo select mostrou que o mesmo havia sido desfeito.
Exemplo de Commit
Podemos usar o mesmo exemplo, mas trocando o Rollback pelo Commit. Veja o resultado:
begin transaction
insert into contas values('600-x',110,0)
select * from contas
commit
select * from contas
Exemplos condicionais de Commit e Rollback
Os exemplos acimas mostram o uso isolado do Commit e Rollback para confirmar ou desfazer uma operação no banco de dados, mas podemos fazer isso baseado em uma condição. Essa condição poderá ser a existência ou não de erros durante a transação. O exemplo abaixo explica melhor isso:
select * from contas
begin transaction
insert into contas values('1000-x',500,0)
select * from contas
insert into contas values('2000-x',0,500)
if @@ERROR <> 0
rollback
else
commit
select * from contas
No exmplo acima faço dois inserts, logo após iniciar uma transação e depois verifico se houve erros. Esta verificação de erros está baseada na variável global @@ERROR que sempre retornará 0 se não houve erros.
Veja o resultado abaixo:
Agora, usando a mesma transação acima, vou inserir um erro na segunda instrução insert. (note que o valor está com virgula e isto causará um erro):
select * from contas
begin transaction
insert into contas values('3000-x',850,0)
select * from contas
insert into contas values('4000-x',0,850,00)
if @@ERROR <> 0
rollback
else
commit
select * from contas
Ao executar novamente o select, notaremos que a transação foi desfeita:
select * from contas
Quando devo usar apostrofe ou aspas simples em SQL e banco de dados
O uso do apostrofe é necessário no INSERT INTO, UPDATE e alguns casos de SELECT. Sua finalidade é delimitar os valores que serão inseridos no banco de dados e evitar possíveis confusões na "cabeça do banco de dados" na hora de executar esses comandos. Isto pode acontecer especialmente nos campos que armazenam valores do tipo texto, como o char, varchar, text e também os tipos data, como date, datetime e outros.
Na instrução SQL cada coisa tem seu significado e você já deve saber disso, como a vírgula que é o separador entre o nome de uma campo e outro ou de um valor e outro. No caso do INSERT, por exemplo, os valores que estão entre vírgulas devem ser únicos e para garantir que isso seja verdade, os campos do tipo texto devem ter o apostrofe como delimitadores, instruindo o banco onde começa e onde termina o valor.
Para os campos numéricos como o INT, Real, decimal, numeric e outros isto não é necessário, pois os valores que serão inseridos já devem estar no formato correto, ou seja, precisam ser numéricos. Um campo texto poderá receber caracteres especiais e espaços em branco, por exemplo, mas os campos numéricos não recebem esse tipo de valor e portanto já são únicos por natureza.
Apóstrofe ou aspas simples?
Aproveitando, só queria ressaltar que o termo correto é mesmo o apóstrofe e não as aspas simples como é comum ouvirmos e inclusive lermos em livros técnicos de programação. Aspas simples não existe no português, isto é uma importação e adaptação do inglês.
Veja também
- 3 perguntas sobre comunicação, internet e redes sociais
- Como a Wikipedia ganha dinheiro se ela não tem anúncios?
- Curso Técnico em Enfermagem em Sorocaba. Pagos e gratuitos
- Curso técnico em São José dos Campos. Escolas estaduais e privadas
- A Historia da Educação no Brasil e no Mundo
- Qual a importância da internet na escola?
- Nota Fiscal Paulista: Cadastro, Consulta de Créditos e Senha de Acesso
- Os melhores canais da TV por Assinatura, TV Paga e Youtube
- Seguro Pay Per Use – Pagamento por uso vale a pena para automóveis?
- TRT02 SP