none
Transacoes implicitas / explicitas RRS feed

  • Pergunta

  • Pessoal,

    Até onde sei por default o SQL trabalha com transações implicitas, ou seja, eu não preciso obrigatoriamente dar um commit no final de uma instrução para que o dado seja confirmado.

    Mas me chamou atenção ao passear pelas configurações da instância (connection) a opção implicit transactions estar desabilitada.

    Qual a relação de iniciar uma transação impliciamente ao executar uma instrução com o commit ?

    Confesso que fiquei meio confusso...

    Valeu !
    Felipe Souza Rasche
    quarta-feira, 23 de dezembro de 2009 11:21

Respostas

  • Boa Noite,

    Acho que alguns conceitos estão ficando um pouco confusos (transações implícitas não significa que o commit é ou não necessário). O SQL Server permite três configurações básicas para trabalhar com transações:

    Transações Autocomitadas (Default)
    Nesse modo, cada comando individual é uma transação que se autocomita. Um bloco com 10 INSERTs por exemplo, considera que cada INSERT individual é uma transação a parte e não é necessário (nem possível) colocar um commit, pois, cada transação individual será comitada por si só

    Transações Explícitas
    Nesse modo, abre-se um bloco de transações com o BEGIN TRAN, coloca-se vários comandos e ao final é necessário efetuar um commit para que os efeitos da transação sejam efetivados ou um rollback para desfazê-los. É obrigatório o uso de um commit para que os efeitos da transação sejam permanentes. A ausência de um commit provocará um rollback posteriormente.

    Transações Implícitas
    Esse modo é muito comum para quem trabalha com outros SGBDs como o Oracle e o DB2. Nesse modo, após conectar-se é aberta uma transação. Diz-se "implícita" porque o usuário não irá explicitar, basta conectar-se e o SGBD já faz isso, ou seja, já providencia um contexto transacional. Usar o modo de transações implícitas, permitirá que um bloco de 10 INSERTs sejam todos uma única transação (mesmo que isso não esteja explícito). Isso significa que ao final é obrigatório o uso de um COMMIT ou de um ROLLBACK para decidir se os efeitos são permanentes ou devem ser desfeitos.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz terça-feira, 23 de outubro de 2012 14:50
    terça-feira, 5 de janeiro de 2010 00:47

Todas as Respostas

  • Felipe,

    Realmente por padrão o SQL Server não necessita que você passe um Commit para confirmar a transação, mas existem vários níveis de isolamento que você poderá trabalhar para realizar este tipo de controle.

    O commit representa uma instrução T-SQL para confirmar os comandos que estão sendo processados dentro de um bloco transacional, quando passamos o commit o SQL Server entende que aquela instrução deve ser confirmada dentro de banco de dados.

    O que você ficou confuso?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 23 de dezembro de 2009 11:50
    Moderador
  • "a opção implicit transactions estar desabilitada"
    Felipe Souza Rasche
    quarta-feira, 23 de dezembro de 2009 12:11
  • Boa Noite,

    Acho que alguns conceitos estão ficando um pouco confusos (transações implícitas não significa que o commit é ou não necessário). O SQL Server permite três configurações básicas para trabalhar com transações:

    Transações Autocomitadas (Default)
    Nesse modo, cada comando individual é uma transação que se autocomita. Um bloco com 10 INSERTs por exemplo, considera que cada INSERT individual é uma transação a parte e não é necessário (nem possível) colocar um commit, pois, cada transação individual será comitada por si só

    Transações Explícitas
    Nesse modo, abre-se um bloco de transações com o BEGIN TRAN, coloca-se vários comandos e ao final é necessário efetuar um commit para que os efeitos da transação sejam efetivados ou um rollback para desfazê-los. É obrigatório o uso de um commit para que os efeitos da transação sejam permanentes. A ausência de um commit provocará um rollback posteriormente.

    Transações Implícitas
    Esse modo é muito comum para quem trabalha com outros SGBDs como o Oracle e o DB2. Nesse modo, após conectar-se é aberta uma transação. Diz-se "implícita" porque o usuário não irá explicitar, basta conectar-se e o SGBD já faz isso, ou seja, já providencia um contexto transacional. Usar o modo de transações implícitas, permitirá que um bloco de 10 INSERTs sejam todos uma única transação (mesmo que isso não esteja explícito). Isso significa que ao final é obrigatório o uso de um COMMIT ou de um ROLLBACK para decidir se os efeitos são permanentes ou devem ser desfeitos.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz terça-feira, 23 de outubro de 2012 14:50
    terça-feira, 5 de janeiro de 2010 00:47