e=Verdana size=2>

Clique aqui para ler todos os artigos desta edição

ADO.NET

Transações com .NET 2.0

Saiba como funciona o System.Transactions

 

Quando você realiza uma compra pela internet, vários passos devem ser realizados para que a venda seja efetivada. Esses passos incluem, por exemplo, a verificação de disponibilidade do produto solicitado no estoque da loja virtual, validação e débito do valor faturado em seu cartão de crédito, baixa no estoque da loja e encaminhamento do produto para envio.

Uma falha em qualquer um dos passos deve fazer com que o pedido seja cancelado, além de desfazer todos os passos anteriores ao erro, caso contrário seu cartão poderia ser debitado mesmo sem a finalização do pedido. Nesse tipo de situação o controle transacional é fundamental.

A utilização de transações está sempre associada ao conceito de atomicidade, ou seja: num conjunto de N passos, cada um dos passos só poderá ser confirmado caso todos os outros tenham sido executados com sucesso também. O .NET Framework 2.0 oferece uma arquitetura completa para a implementação de transações através do namespace System.Transactions, suportando transações com SQL Server, ADO.NET, filas de mensagens (MSMQ) e do próprio coordenador de transações da Microsoft, o MSDTC (Microsoft Distributed Transaction Coordinator), nativamente.

Neste artigo, exploraremos as funcionalidades oferecidas pelo framework para a utilização de transações de forma implícita e explícita. Paralelamente, desenvolveremos uma aplicação que realiza a atualização de uma mesma base de dados em dois servidores distintos, demonstrando na prática as funcionalidades descritas ao longo do texto.

 

Criando a aplicação

Para o entendimento paralelo de teoria e prática na utilização de transações, criaremos uma aplicação que realiza a atualização de algumas informações na tabela Products do banco de dados Northwind.

Para caracterização de um conjunto de passos a serem executados, exigindo controle transacional, trabalharemos com dois servidores distintos, cada um com sua cópia do banco de dados: uma instância SQL Server 2000 e outra do SQL Server 2005.

 

Nota: Apesar deste artigo utilizar conexões a bancos de dados distintos, o mesmo também pode ser desenvolvido utilizando um único servidor, desde que sejam criadas conexões a dois bancos de dados diferentes.

 

Abra o Visual Studio 2005 e clique em File>New>Project. Na opção Visual C#>Windows, selecione o item Windows Application. Dê o nome de “TransactionsDotNetMagazine” ao projeto e clique em OK.

Criado o projeto, renomeie o Form1.cs para “FrmTransactions.cs”, e crie os componentes de interface da maneira indicada pela Figura 1.

 

Figura 1. Layout e componentes da classe FrmTransactions

 

Ainda no Solution Explorer, clique com o botão direito em References e selecione a opção Add Reference. Na aba .NET, selecione o System.Transactions, clicando em OK na seqüência.

Com os componentes dispostos e devidamente configurados, partiremos para o código. O primeiro passo é fazer com que o grdProdutos seja populado. Para isso, criaremos o método CarregarDados, que será o responsável por consultar os dados necessários na tabela Products e associá-los ao grdProdutos. A chamada ao método será feita no construtor do formulário, como mostra a Listagem 1.

 

Nota: Como as strings de conexão serão utilizadas em diversos métodos de nossa aplicação, as mesmas foram colocadas como atributos da classe, como mostrado pela Listagem 1.

 

Listagem 1. Estrutura inicial da classe frmTransactions

...

using System.Data.SqlClient;

using System.Transactions;

 

namespace TransactionsDotNetMagazine

{

  public partial class frmTransactions : Form

  {

    private string connString2005 =

      @"Data Source=(local)\SQL2005;"+

      "Initial Catalog=Northwind;User ID=sa;"+

      "Password=suasenha;";

    private string connString2000 =

      @"Data Source=(local);Initial Catalog="+

      "Northwind;User ID=sa;Password=;";

 

    public frmTransactions()

    {

      InitializeComponent();

      this.CarregarDados();

    }

 

    //Atualiza os dados do grdProdutos

    private void CarregarDados()

    {

      using (SqlConnection sqlConn =

        new SqlConnection(connString2005))

      {

        sqlConn.Open();

...

Quer ler esse conteúdo completo? Tenha acesso completo