Bom, pensem em transações como se fossem compras. Quando vamos a uma loja, damos o dinheiro e obtemos uma mercadoria. Se obtemos uma mercadoria com problema, ou recebemos nosso dinheiro de volta ou outra mercadoria sem o problema.
As transações no SQL Server seguem este mesmo princípio. Ou você tem todos os seus dados íntegros e consistentes no seu banco, ou não tem dado nenhum. Este tipo de transação também é chamado de two phase commit (commit de duas fases, pois ou tem os dados, ou não tem nada).
Agora, só mais um detalhe. Existem vários níveis de implementação de transação. Por exemplo, no ASP podemos utilizar alguns comandos do ADO (ActiveX Data Objects) para fazer transação. Mas se pensarmos em componentes , podemos utilizar ainda o MTS (Microsoft Transaction Server) para fazer as trasanções para componentes. Vou falar hoje um pouco sobre as transações simples no SQL Server. Existem ainda as transações distribuídas, mas isto fica para uma próxima coluna.
Basicamente as transações no SQL Server são feitas utilizando três comando: BEGIN TRANSACTION, COMMIT e ROLLBACK. Abaixo um exemplo de código utilizando uma transação:
BEGIN
TRANSACTION
UPDATE
TABELA1 SET CAMPO1 = ‘NOVO VALOR’
WHERE
CAMPO2 = 35
IF
@@ERROR <> 0
ROLLBACK
ELSE
COMMIT
Perceba que no exemplo acima , iniciamos a transação com o BEGIN TRANSACTION. Vamos supor que a tabela possua 5000 registros que satisfaçam a condição e que por algum motivo transcendente mediúnico, no registro 4628 houve um problema. Neste caso, a variável do SQL Server chamada @@ERROR vai guardar o código do erro, o comando ROLLBACK será executado e os 4628 registros já atulizados serão automaticamente voltados ao seu estado anterior. Alternativamente, se tudo correr bem , o comando COMMIT é executado e todos os 5000 registros que atenderam à condição serão atualizados com êxito.
Só um detalhe quanto aos comandos ROLLBACK e COMMIT.Sem nomear uma transação , o uso do TRANSACTION é opcional. Ou seja:
ROLLBACK tem o mesmo funcionamento de ROLLBACK TRANSACTION
COMMIT
tem o mesmo funcionamento de COMMIT
TRANSACTION
quando
não colocamos nomes na transação.
Mas não se esqueça que BEGIN TRANSACTION não tem o mesmo funcionamento de BEGIN.
Agora, algumas dicas interessantes quanto ao uso de transações:
1. Mantenha transações curtas, ou seja, não coloque muitas instruções SQL entre o BEGIN TRANSACTION e o COMMIT. Apesar de outros usuários enxergarem os dados de uma transação que ainda não fez o COMMIT, os dados ficam gravados no SQL dentro do arquivo de Transaction Log (geralmente com a extensão .ldf)
2. Vamos supor que alguém resolva utilizar a mesma tomada do computador servidor em que o SQL Server está rodando para ligar uma cafeiteira , quando uma transação foi iniciada mais ainda não fez o COMMIT. Neste caso , quando o serviço do SQL Server foi reiniciado , todas as transações que ainda não executaram o COMMIT voltarão ao seu estado inicial antes do BEGIN TRANSACTION.
3. Procure sempre dar nomes as transações.Isso obriga o utilização do TRANSACTION no COMMIT e no ROLLBACK. Exemplo:
BEGIN
TRANSACTION TRAN_01
DELETE
FROM TABELA1
IF
@@ERROR <> 0
ROLLBACK TRANSACTION TRAN_01
ELSE
COMMIT TRANSACTION TRAN_01
4) Encadeamento de transações são permitidos. Para ver em que nível de transação você está , utilize a variável @@TRANCOUNT
Abraço!
É possivel que um comit de uma Proc interfira nos TRANSACTIONS de outras que estão em execução no mesmo momente através de um programa chamador
Responder comentárioÉ possivel ?
Utilizo o Sybase E agluem do meu Depto comentou que isso já ocorreu .
de um COMMIT fechar todos os Transactions que estão abertos no mesmo momento
É possivel ?
Utilizo o Sybase E agluem do meu Depto comentou que isso já ocorreu .
de um COMMIT fechar todos os Transactions que estão abertos no mesmo momento
É possivel ?
Utilizo o Sybase E agluem do meu Depto comentou que isso já ocorreu .
de um COMMIT fechar todos os Transactions que estão abertos no mesmo momento
Finalmente percebi o que era transacções em Sql. Simples e eficaz. Muito bom Mauro.
Responder comentárioOs textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
Mauro Pichiliani é mestre em computação, possui as certificações MCP, MCDBA, MCT e MCTS e atua como consultor de banco de dados com enfoque na área de tunning.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.