locked
Obrigando uso do commit RRS feed

  • Pergunta

  •  

    Prezados Senhores,

     

    Preciso saber se existe alguma maneira de configurar o SQL Server 2005, para obrigar o uso do commit ou rollback para comandos DML, pois na configuração atual, depois de uma instrução insert o registro é inserido na base de dados mesmo sem o uso do commit.

     

    Sei que posso usar a instrução BEGIN TRANSACTION antes do comando DML, ou configurar ativar a opção SET IMPLICIT_TRANSACTION no sql server manegement studio, mas a primeira tem o inconveniente de não ser obrigatório o uso e a segunda opção obriga o uso do commit mesmo depois de uma instrução select.

     

    Portanto, minha intenção é tornar o uso do commit obrigatório, independente da ferramenta usada para acessar o banco, criando assim uma segurança adicional para execução de comandos DML acidentais.

     

    Caso alguém possa me ajudar, desde já antecipo meus agradecimentos.

    quarta-feira, 6 de fevereiro de 2008 15:17

Respostas

  • Pensador,

     

    Bom inicialmente o SQL Server faz o seguinte a partir do momento que um comando é executado por padrão o commit é executado, sendo que, o rollback somente será processado por uma ação do usuário ou caso o próprio SQL Server identifique que algo de errado esta ocorrendo então o Rollback é disparado.

     

    Através de uma análise realizada pelo CheckPoint o SQL Server, sabe se vai fazer um Commit ou Rollback mas tendo sempre em mente que o COMMIT é a primeira opção.

    quarta-feira, 6 de fevereiro de 2008 19:11
  •  

    JCastro,

     

    Obrigar o uso do Commit é um tanto complicado, principalmente em relação ao que você deseja. Você que sempre seja feita uma confirmação das transações executadas, certo? Então, se for executado um Commit (obrigatório) você sempre estaria confirmando elas.

     

    Eu daria a seguinte idéia, ative o IMPLICIT_TRANSACTIONS, dessa forma, toda e qualquer modificação irá abrir uma transação, e no final do código, inclua a seguinte instrução:

     

    Code Snippet

    WHILE @@TRANCOUNT > 0 COMMIT

     

     

     

    Com isso, será executado COMMIT até que não existam mais transações abertas.

     

     

    Já o ROLLBACK, em geral é executado pela própria aplicação em momentos onde algum problema é detectado (com relação a dados, por exemplo), ou pelo SQL, quando encontrado algum problema, pro exemplo um DEADLOCK ou erro de FK (dê uma lida sobre o SET XACT_ABORT, ele vai influenciar no rollback em algumas situações).

     

     

    Abraço!!!

    quarta-feira, 6 de fevereiro de 2008 19:35

Todas as Respostas

  • Pensador,

     

    Bom inicialmente o SQL Server faz o seguinte a partir do momento que um comando é executado por padrão o commit é executado, sendo que, o rollback somente será processado por uma ação do usuário ou caso o próprio SQL Server identifique que algo de errado esta ocorrendo então o Rollback é disparado.

     

    Através de uma análise realizada pelo CheckPoint o SQL Server, sabe se vai fazer um Commit ou Rollback mas tendo sempre em mente que o COMMIT é a primeira opção.

    quarta-feira, 6 de fevereiro de 2008 19:11
  • Prezado Junior Galvão,

     

    Fico agradecido por sua resposta e por seu tempo usado na mesma, mas aproveito a oportunidade para perguntar se existe alguma maneira de desabilitar o autocommit do sql server.

     

    Portanto necessito que o commit fique de forma manual, deixando a cargo do usuário realizá-lo ou não. pois caso ocorra um delete acidental o mesmo pode realizar um rollback, sem ser obrigado a escrever a instrução BEGIN TRANSACTION antes do delete.

     

    Cordialmente,

     

    quarta-feira, 6 de fevereiro de 2008 19:29
  •  

    JCastro,

     

    Obrigar o uso do Commit é um tanto complicado, principalmente em relação ao que você deseja. Você que sempre seja feita uma confirmação das transações executadas, certo? Então, se for executado um Commit (obrigatório) você sempre estaria confirmando elas.

     

    Eu daria a seguinte idéia, ative o IMPLICIT_TRANSACTIONS, dessa forma, toda e qualquer modificação irá abrir uma transação, e no final do código, inclua a seguinte instrução:

     

    Code Snippet

    WHILE @@TRANCOUNT > 0 COMMIT

     

     

     

    Com isso, será executado COMMIT até que não existam mais transações abertas.

     

     

    Já o ROLLBACK, em geral é executado pela própria aplicação em momentos onde algum problema é detectado (com relação a dados, por exemplo), ou pelo SQL, quando encontrado algum problema, pro exemplo um DEADLOCK ou erro de FK (dê uma lida sobre o SET XACT_ABORT, ele vai influenciar no rollback em algumas situações).

     

     

    Abraço!!!

    quarta-feira, 6 de fevereiro de 2008 19:35
  • rapaz...essa é nova heim...eu não acho isso muito bom não...

     

    fazer isso para evitar manipulação de dados errada...qual é a frequencia desses erros?

     

    saiba que essa alteração se for feita, vai aumentar o tempo de uso dos recursos em cima dos objetos em questão...aumento do tempo de locks ativos, e por ai vai...

     

    quinta-feira, 7 de fevereiro de 2008 00:59
  •  

    Prezados Senhores,

     

    Sou grato por suas respostas e posso dizer que me dou por satisfeito nesse nosso pequeno debate.

     

    Cordialmente,

     

    quinta-feira, 7 de fevereiro de 2008 15:39
  • Pensador,

     

    Obrigado pelo retorno.

    quinta-feira, 7 de fevereiro de 2008 16:32