Controlando transações (Mecanismo de Banco de Dados)

Os aplicativos controlam transações principalmente ao especificar quando uma transação começa e termina. Isso pode ser especificado pelo uso de instruções Transact-SQL ou funções de interface de programação de aplicativo (API) de banco de dados. O sistema também deve ser capaz de processar corretamente os erros que encerram uma transação antes de sua conclusão.

Por padrão, as transações são gerenciadas no nível de conexão. Quando uma transação é iniciada em uma conexão, todas as instruções Transact-SQL executadas nessa conexão fazem parte da transação até a conclusão da transação. Porém, em uma sessão de vários conjuntos de resultados ativos (MARS), uma transação Transact-SQL explícita ou implícita se torna uma transação no escopo do lote gerenciada no nível do lote. Quando o lote for concluído, se a transação no escopo do lote não for confirmada ou revertida, ela será revertida automaticamente pelo SQL Server.

Iniciando transações

Ao usar funções de API e instruções Transact-SQL, você pode iniciar transações em uma instância do Mecanismo de banco de dados do SQL Server como transações explícitas, autoconfirmadas ou implícitas. Em uma sessão de MARS, as transações explícitas e implícitas do Transact-SQL se tornam transações no escopo do lote.

  • Transações explícitas
    Inicie uma transação explicitamente por uma função de API ou emitindo a instrução Transact-SQL BEGIN TRANSACTION.

  • Transações de confirmação automática
    O modo padrão do Mecanismo de Banco de Dados. Cada instrução Transact-SQL individual é confirmada na conclusão. Você não precisa especificar nenhuma instrução para controlar transações.

  • Transações implícitas
    Defina o modo de transação implícito como ativado por uma função de API ou pela instrução Transact-SQL SET IMPLICIT_TRANSACTIONS ON. A próxima instrução inicia uma nova transação automaticamente. Quando essa transação é concluída, a próxima instrução Transact-SQL inicia uma nova transação.

  • Transações no escopo do lote
    Aplicável apenas a vários conjuntos de resultados ativos (MARS), uma transação Transact-SQL explícita ou implícita iniciada em uma sessão MARS se torna uma transação no escopo do lote. Uma transação no escopo do lote não confirmada ou revertida quando um lote é concluído é revertida automaticamente pelo SQL Server.

Os modos de transação são gerenciados no nível de conexão. Se uma conexão for alterada de um modo de transação para outro, isso não terá nenhum efeito nos modos de transação de qualquer outra conexão.

Finalizando transações

Você pode finalizar transações com uma instrução COMMIT ou ROLLBACK ou por uma função de API.

  • COMMIT
    Se uma transação for concluída com êxito, confirme-a. Uma instrução COMMIT garante que todas as modificações na transação fazem parte permanente do banco de dados. Um COMMIT também libera recursos, como bloqueios, usados pela transação.

  • ROLLBACK
    Se ocorrer um erro em uma transação ou se o usuário decidir cancelá-la, reverta a transação. Uma instrução ROLLBACK desfaz todas as modificações feitas na transação retornando os dados ao estado anterior ao início da transação. Um ROLLBACK também libera recursos usados pela transação.

ObservaçãoObservação

Em conexões habilitadas para oferecer suporte a vários conjuntos de resultados ativos (MARS), uma transação explícita iniciada por uma função de API não pode ser confirmada enquanto houver solicitações pendentes para execução. Qualquer tentativa de confirmação desse tipo de transação enquanto houver operações pendentes sendo executadas resultará em um erro.

Especificando os limites da transação

Você pode identificar quando as transações Mecanismo de Banco de Dados são iniciadas e finalizadas com instruções Transact-SQL ou funções e métodos de API.

  • Instruções Transact-SQL
    Use as instruções BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK e SET IMPLICIT_TRANSACTIONS para delinear transações. Elas são usadas principalmente em aplicativos DB-Library e em scripts Transact-SQL, como os scripts executados usando o utilitário de prompt de comando osql.

  • Funções e métodos de API
    As APIs de banco de dados como ODBC, OLE DB, ADO e o namespace do SQLClient do .NET Framework contêm funções ou métodos usados para delinear transações. Elas são os mecanismos principais usados para controlar transações em um aplicativo Mecanismo de Banco de Dados.

Cada transação deve ser gerenciada por apenas um desses métodos. Usar ambos os métodos na mesma transação pode levar a resultados indefinidos. Por exemplo, você não deve iniciar uma transação usando as funções de API ODBC e, depois, usar a instrução COMMIT do Transact-SQL para concluir a transação. Isso não notificaria o driver ODBC SQL Server de que a transação está confirmada. Nesse caso, use a função SQLEndTran de ODBC para finalizar a transação.

Erros durante o processamento de transações

Se um erro impedir a conclusão bem-sucedida de uma transação, o SQL Server reverterá automaticamente a transação e liberará todos os recursos usados por ela. Se a conexão de rede do cliente com uma instância do Mecanismo de Banco de Dados for interrompida, quaisquer transações pendentes para a conexão serão revertidas quando a rede notificar a instância sobre a interrupção. Se o aplicativo cliente falhar ou se o computador cliente for desligado ou reiniciado, isso também interromperá a conexão e a instância do Mecanismo de Banco de Dados reverterá quaisquer conexões pendentes quando a rede notificar a interrupção. Se o cliente fizer logoff do aplicativo, quaisquer transações pendentes serão revertidas.

Se ocorrer um erro de instrução de tempo de execução (como uma violação de restrição) em um lote, o comportamento padrão no Mecanismo de Banco de Dados será reverter somente a instrução que gerou o erro. Você pode alterar esse comportamento usando a instrução SET XACT_ABORT. Depois que SET XACT_ABORT ON for executada, qualquer erro de instrução em tempo de execução fará com que a transação atual seja revertida. Os erros de compilação, como erros de sintaxe, não são afetados por SET XACT_ABORT. Para obter mais informações, consulte SET XACT_ABORT (Transact-SQL).

Quando ocorrerem erros, a ação corretiva (COMMIT ou ROLLBACK) deverá ser incluída em um código de aplicativo. Uma ferramenta eficiente para processar erros, inclusive aqueles em transações, é a construção TRY...CATCH Transact-SQL. Para obter mais informações com exemplos que incluem transações, consulte Usando TRY...CATCH na Transact-SQL e TRY...CATCH (Transact-SQL).