Implementando controle de transações com TransactionScope 
Escrito por Fabio Centenaro • Jun 23rd, 2008 • Categoria: .NET, Programação
Controle de transações é algo que passa batido em sistemas pequenos ou em sistemas onde a preocupação com a consistência dos dados não é relevante (não vou entrar na questão que se um sistema possui dados inconsistentes então é melhor não ter sistema algum). Mas o número de programadores que não utilizam algum sistema de controle de transação é bastante grande e a preocupação com os dados e a sua consistência acaba ficando em segundo plano. Deixou de ser exceção o sistema que deve estar pronto em um curtíssimo espaço de tempo e com isso outros aspectos que deveriam ser exceção se tornaram regras. E controle de transação é um deles. Neste artigo veremos como implementar um sistema de transações utilizando o .NET Framework.
Introdução
O controle de transação serve para garantir a integridade dos dados. Isso significa que através dele podemos ter a certeza de que todos os dados serão gravados no banco de dados. Em caso de eventual falha em algum momento da gravação todo o processo volta ao estado inicial, sem inserções parciais. Ao encontrar um erro durante o processo (leia-se um ou mais inserts em seqüencia) simplesmente é dado um rollback e nada é gravado no banco. Ao completar o processo com sucesso, a transação dá um commit e grava os dados no banco.
Exemplificando
Peguemos um sistema de vendas como exemplo. Para efetuar um pedido, devemos gravar as informações do cliente na tabela cliente, os itens do pedido na tabela itens, atualizar o estoque na tabela produtos e por fim gravar os dados da venda na tabela vendas. Agora imaginemos que no meio deste processo é gerado algum erro. Digamos que já tenhamos inserido os dados na tabela de clientes, os itens do pedido e atualizado o estoque. Falta apenas gravar os dados da venda. E neste momento ocorre algum erro. O que fazer com os dados que já foram gravados? Como fica o estoque que já foi atualizado? Em um sistema que não possui nenhum tipo de controle, isso seria o caos: o estoque fica comprometido, o banco de dados ganha inconsistências e nunca o sistema será confiável.
Pondo a teoria em prática
Então vamos implementar o nosso controle de transações utilizando o TransactionScope, fornecido pela biblioteca System.Transactions.dll. Em primeiro lugar devemos adicionar a referencia da biblioteca em nosso projeto. Com isso, basta ir no menu Project e depois em Add Reference.

Depois selecionamos o assembly System.Transactions.

Depois disso é só pôr a mão na massa. Primeiramente adicionamos a referência à nossa classe.
Em C#
using System.Transactions;
Em VB
Imports System.Transactions
Feito isso, agora implementar o controle de transações:
Em C#
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
//Insira os comandos de insert aquiscope.Complete();
}
Em VB.NET
Using scope As New TransactionScope(TransactionScopeOption.Required, IsolationLevel.ReadCommitted)
‘* Insira os comandos de insert aqui
scope.Complete()
End Using
Parâmetros Necessários
Para criar uma nova instância de um TransactionScope, devemos passar alguns parâmetros.
TransactionScopeOption
Em TransactionScopeOption temos as seguintes opções:
Required - Re-utiliza uma transação ativa ou cria uma nova caso não haja nenhuma ativa.
RequiresNew - Cria sempre uma nova transação sem re-aproveitar outra transação.
Suppress - Simplesmente não utiliza nenhuma transação.
IsolationLevel
Serializable - Os dados, durante a transação, podem ser lidos mas nenhum dado pode ser adicionado ou modificado.
RepetableRead - Os dados podem ser lidos e adicionados mas não podem ser modificados.
ReadCommited - Dados não podem ser lidos, mas podem ser modificados.
ReadUncommited - Dados podem ser lidos e modificados durante a transação.
Snapshot - Os dados podem ser lidos e modificados, porém, antes de modificar alguma informação, a transação verifica se o conjunto de dados permanecem os mesmos. Se tiverem sido alterados, uma exceção é gerada.
Chaos - As alterações pendentes de transações em níveis superiores não podem ser sobrepostas.
Unspecified - Um IsolationLevel diferente do atual está sendo usado, mas não é possível determinar o seu tipo. Neste caso é gerada uma exceção.
Finalizando
Implementar um controle de transações é algo muito simples e poupa muita dor de cabeça. O ideal seria que todos os sistemas, por mais simples que sejam, utilizassem um controle como este. Desta forma seria possível entregar sistemas mais seguros e confiáveis, melhorando a qualidade do produto e a imagem do desenvolvedor junto aos clientes.
Confira ofertas de: DVD, filmes, celular, notebook, livros, jogos, Wii, PS3, MP4


Com o sql server funciona perfeitamente porem com o firebird não dá erro algum porém mesmo sem fazer o scope.Complete() o registro é comitado no banco..
Sabes o que pode estar ocorrendo?