Discussion:
Transação ou mudança da arquitetura do sistema?
(too old to reply)
Rodrigo Santiago
2006-03-30 16:28:03 UTC
Permalink
Pessoal,
na verdade eu não sei se isso é uma dúvida de progrmação ou de arquitetura
mas o meu problema é garantir que todas as rotinas sejam cadastradas com
confiabilidade.
Recebo via web service as informações de pedido e neste pedido vem
informações da ordem, do produto, do cliente.
Na minha aplicação tenho (c# + ASP.net) tenho uma classe para cada um dos
grupos.
Na rotina de recebimento dessas informações eu instancio cada uma das
classes até passar por todas e eu ter o meu pedido totalmente cadastrado no
banco.
fica parecido com o exemplo abaixo:
public void recebe()
{
//validação e inserção do order
order od = new order();
od.valida();
od.insert();

//validação e inserção do produto
produto pd = new produto();
pd.valida();
pd.insert();

//validação e inserção do cliente
cliente cl = new cliente();
cl.valida();
cl.insert();
...
}

Bom, até aí tudo bem mas o meu problema é que em alguns pedidos e a causa eu
não sei bem ao certo mas acho q é time out no SQL Server, o sistema cadastra
o pedido mas não cadastra o cliente por exemplo.
Dentro das metodos valida e insert tenho vários outros métodos q garantem a
consistencia dos dados.
A minha dúvida é a seguinte: eu terei que passar uma transação por toda a
minha aplicação, ou seja, alterar todas as rotinas para receber como
parâmetro uma transação e trabalhar sempre com a mesma conexão?
mas aí está outro problemas pq faço conexão em outros bancos e em várias
tabelas.

agradeço antecipadamente por qualquer ajuda,
Rodrigo
Guilherme Labigalini
2006-03-31 16:09:01 UTC
Permalink
Ola Rodrigo,

Aqui na empresa criamos um componente que encapsula o trasacao, deixando
todo o processo em uma unica transacao.

Vc pode criar uma classe parecida com o TransactionScope do .net (mais
simplificada claro) para resolver o seu problema.

ficando algo:

using (new TransactionScope (...))
{
order od = new order();
od.valida();
od.insert();

//validação e inserção do produto
produto pd = new produto();
pd.valida();
pd.insert();

//validação e inserção do cliente
cliente cl = new cliente();
cl.valida();
cl.insert();

}

Para facilitar de uma olhada no FW Castle.NET ele ja implementa esse
conceito, ai fica mais facil pra vc.

Se os seus compoente forem distruitos e nao for possivel compartilhar a
mesma trasacao (nem via DTC) ai o problema é maior rs.. para isso aqui dentro
fizemos uma ferramenta que "orquestrata" todo o processe de negocio.
--
[]''s
Guilherme Labigalini
Post by Rodrigo Santiago
Pessoal,
na verdade eu não sei se isso é uma dúvida de progrmação ou de arquitetura
mas o meu problema é garantir que todas as rotinas sejam cadastradas com
confiabilidade.
Recebo via web service as informações de pedido e neste pedido vem
informações da ordem, do produto, do cliente.
Na minha aplicação tenho (c# + ASP.net) tenho uma classe para cada um dos
grupos.
Na rotina de recebimento dessas informações eu instancio cada uma das
classes até passar por todas e eu ter o meu pedido totalmente cadastrado no
banco.
public void recebe()
{
//validação e inserção do order
order od = new order();
od.valida();
od.insert();
//validação e inserção do produto
produto pd = new produto();
pd.valida();
pd.insert();
//validação e inserção do cliente
cliente cl = new cliente();
cl.valida();
cl.insert();
...
}
Bom, até aí tudo bem mas o meu problema é que em alguns pedidos e a causa eu
não sei bem ao certo mas acho q é time out no SQL Server, o sistema cadastra
o pedido mas não cadastra o cliente por exemplo.
Dentro das metodos valida e insert tenho vários outros métodos q garantem a
consistencia dos dados.
A minha dúvida é a seguinte: eu terei que passar uma transação por toda a
minha aplicação, ou seja, alterar todas as rotinas para receber como
parâmetro uma transação e trabalhar sempre com a mesma conexão?
mas aí está outro problemas pq faço conexão em outros bancos e em várias
tabelas.
agradeço antecipadamente por qualquer ajuda,
Rodrigo
Loading...