Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Listagem de Bug's
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

System.Transactions e DbConnectionScope

Pesquisa personalizada
Pesquisar Dicas:






No Framework .NET 2.0 foi criado um namespace chamado System.Transactions com o objetivo de controlar transações de negócio, o que a principio seriam transações distribuidas.

Este conceito já existia anteriormente, no COM+, mas para muitos foi uma grande novidade. Porém é um conceito tão natural e necessário para o desenvolvimento em camadas que antes do surgimento do System.Transactions - e antes que muitos se acostumassem com ele - já se buscavam soluções alternativas.

Um exemplo : Em um sistema em camadas, imagine a existência de um componente de Estoque, e um de clientes. Para realizar uma venda, o componente de estoque teria que ser chamado para reduzir o estoque e o de clientes para cadastrar os clientes.

A questão é que todo o processo - a venda - precisaria ser transacional. Porém o componente e estoque e o de clientes precisam, em um sistema OO bem delineado, ser independentes, controlando sua própria conexão de acesso a banco.

É neste ponto que entra o namespace System.Transactions. Com ele podemos abrir uma transação e incorporar na transação ações de métodos de outros componentes. Os métodos em questão não precisam ter sido codificados especialmente para fazer parte da transação, serão incorporados a ela automaticamente :

   1: using tr as new transactionscope()
   2:     try
   3:         objEstoque.ReduzEstoque(qtd)
   4:         objCliente.CadastraCliente(Dados)
   5:         tr.complete
   6:     catch ex as exception
   7:         tr.dispose
   8:     end try
   9: end using

 

A mágica é feita por um serviço que faz parte do sistema operacional desde o Windows 2000, o MSDTC - Microsoft Distributed Transaction Coordinator. O MSDTC assume o controle da transação, interceptando as conexões a banco para fazer contato com os servidores de forma transacional.

Antes da existência do namespace System.Transactions, desenvolvedores criavam alternativas passando como parâmetro para os métodos uma conexão aberta. Com a conexão sendo passada como parâmetro, todos os métodos estariam utilizando a mesma conexão de banco, tornando possível fazer uma transação diretamente com a conexão de banco.

O problema desta alternativa que foi muito usada é que criava uma dependência entre classes que deveriam ser mais independentes, criando um alto acoplamento entre os componentes. O System.Transactions, então, sempre foi a solução ideal.

Porém nem todos apreciam o uso do System.Transactions. Isso porque as transações distribuidas com MSDTC consomem mais recursos da máquina do que uma simples transação de banco.

Em uma revitalização do antigo modelo de compartilhamento de conexões, membros da equipe de ADO.NET da Microsoft disponibilizaram o código fonte de uma classe chamada dbConnectionScope. Em resumo, esta classe permite o compartilhamento de conexões entre componentes, mas sem aumentar demasiadamente o acoplamento, criando um meio termo entre ambas as soluções.

Aplicando a classe dbConnectionScope, o código da transação fica da seguinte forma :

   1: using tr as new transactionscope
   2:     using db as new dbConnectionScope
   3:         try
   4:             objestoque.ReduzEstoque(qtd)
   5:             objCliente.CadastraCliente(dados)
   6:             tr.Complete()
   7:         catch ex as exception
   8:             tr.Dispose()
   9:         end try
  10:     end using
  11: end using


O segredo fica dentro do código interno dos método ReduzEstoque e CadastraCliente : Sim, os métodos precisarão ter sido construidos de forma a suportar este recurso. Porém a classe dbConnectionScope  é, digamos, hibrida, funciona com ou sem transação. Veja o ponto chave dentro do método :

   1: cmd.Connection = DbConnectionScope.Current.GetOpenConnection(SqlClientFactory.Instance, connStr)


Desta forma, é a classe DbConnectionScope que fornece a conexão de ambos os métodos. Esta classe guarda as conexões anteriormente abertas para serem re-utilizadas nos métodos.

O resultado é que, com 2 métodos utilizando uma única conexão, o TransactionScope não precisa elevar o nível da transação para transação distribuida, podendo utilizar uma simples transação de banco, mantendo assim a aplicação mais leve.

Considerando a técnica com tableAdapters que gosto de utilizar, o código de uma transação distribuida fica da seguinte forma :

   1: Using tr As New TransactionScope
   2:     Try
   3:         trCli.AtualizarRegiao("Rio", "Brazil")
   4:         trprod.AumentarPreco(1.1)
   5:         tr.Complete()
   6:     Catch ex As Exception
   7:         tr.Dispose()
   8:     End Try
   9: End Using


Para utilizar o DbConnectionScope neste exemplo temos 2 opções : Podemos utilizar partial class do table adapter ou podemos fazer isso diretamente na montagem da transação, veja como fica este 2o caso :

   1: Using tr As New TransactionScope
   2:     Using db As New DbConnectionScope
   3:         Try
   4:             trCli.Connection = DbConnectionScope.Current.GetOpenConnection(SqlClientFactory.Instance, trCli.Connection.ConnectionString)
   5:             trprod.Connection = DbConnectionScope.Current.GetOpenConnection(SqlClientFactory.Instance, trCli.Connection.ConnectionString)
   6:             trCli.AtualizarRegiao("Rio", "Brazil")
   7:             trprod.AumentarPreco(1.1)
   8:             tr.Complete()
   9:         Catch ex As Exception
  10:             tr.Dispose()
  11:         End Try
  12:     End Using
  13: End Using

O interessante deste caso é que o controle da conexão pode ser programado dentro dos tableAdapters - através das partial class - ou fora, como no exemplo acima.

Veja como fica o resultado destas duas transações pelo SQL Profiler :

Observe no resultado acima a diferença entre uma transação distribuida simples - com duas conexões - e uma transação utilizando o dbconnectionscope, mantendo consequentemente uma única conexão nos acessos a dados.

O resultado também pode ser observado na análise das estatísticas de transação do MSDTC. Isso pode ser obtido rodando-se o MMC e adicionando-se o snap-in do gerenciador de componentes, então observamos o seguinte :

A observação é simples : A cada vez que executamos a transação distribuida simples a quantidade de transações na estatística do MSDTC aumenta automaticamente. Quando rodamos a transação com o DbConnectionScope a quantidade fica inalterada.

Observações

O TransactionScope não abre diretamente uma transação distribuida como poderia-se pensar, ele apenas transforma a transação em distribuida se isso se tornar necessário durante a execução.

O DbConnectionScope é uma forma elegante de trabalhar e mantém um acoplamento menor do que as antigas gambiarras, mas o acoplamento ainda não é tão baixo quando poderia com as transações distribuidas especialmente se considerar as limitações de uso de uma mesma conexão (não poder manter dois datareaders simultâneos, exceto com MARS). Enfim, é uma escolha delicada de arquitetura.

O ThreadStatic no código do DbConnectionScope deve ser alterado para que funcione em ambiente WEB - ASP.NET



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

Veja abaixo os comentários já enviados :

Nome : retentores e rolamentos E-Mail : contatovedapac@hotmail.com


Boa tarde Bufaloinfo , Trabalhamos com

Trabalhamos com as melhores marcas e fabricações de rolamentos, polias , correias , gaxetas , orings , aneis , aneis elasticos , aneis de trava , colas , itens de fixação , isolação e vedaçoes e artefatos de borrachas em geral cfe amostra e desenho tecnico, arruelas , selos mecanicos , teflon, encapsulados e etc... temos mais de 500.000 mil itens em estoque

Temos compostos variados (viton, silicone, poliuretano, hypalon, nitrílica, etc.), além disso trabalhamos com massa de borracha, pisos de borracha, raspadores, placas, coxins, guias, diafragmas, juntas p/ trocador de calor, , perfis sólidos e esponjosos e artefatos em geral.



consute-nos


www.vedapac.com.br
vendas@vedapac.com.br
contato@vedapac.com.br
contatovedapac@hotmail.com
11 3872 9180






















Nome : 4NyUkZAmqWb1 E-Mail : zynep806ojd@mail.com
RC8e ready to race, just add charger. $400onoHobbywing 80A/2250kv combo, Team Orion 4S Hardcase 5100mah, IP 4S Hardcase 5400mah, Hitec 5645MG servo, AE XP30 27Mhz radio, 95% VP-Pro TurboTrax, as new AE tyres, Dialed R/C caayrbrg. All the nitro gear comes with it as well.DNX408, full ready to race nitro set up minus radio. AE XP1015/1313 servos, OS 21XZ-B engine, hudy starter box, batteries, set of AKA Enduros 85%, 5.5L of AT Platinum 25% fuel, ProComp engine warmer and lipo (awesome thing!), upgraded clutch and CF parts, plenty of spares. $450onoReedy Sonic 13.5T BNIB $70Reedy Sonic 8.5T 3 meets old $55Reedy Sonic 17.5T several meets old and as used in my ST on Sunday $451/8th VP-Pro Axmen Ultraflex BNIP full set of 4 $201/8th VP-Pro Axmen Ultraflex mounted 95% tread, full set $201/8th VP-Pro Axmen Ultraflex mounted 85% tread, full set $151/8th VP-Pro Madrunner Ultraflex mounted 45% tread, full set $5All 1/8th tyres for $5010th JC Barcodes Rear buggy soft, 4 pairs $10each10th JC Barcodes 4wd front buggy soft, 2 paris $10each10th PL Caliber Rear buggy soft $1010th PL Bow-tie Rear buggy soft $1010th PL Road Rage Rear buggy medium $5All 1/10th tyres for $70IP 2S 5000mah 50C hardcase lipos, deans plugs, minimal use x2 $30eachAirtronics 92524 FH2 rx, two tabs broken but function fine $20Dialed Inc. Truggy hauler bag $10Alex 0400540753 or