StrataFrame Forum

Tratando concorrência com SF.

http://forum.strataframe.net/Topic14660.aspx

By Valdair Ziegler - 3/5/2008

Olá.

Como tratar a concorrência durante a inclusão de registros com SF?

Ex:  Tenho um form para cadastro de clientes que tem chave primária auto-incremento. Se eu tiver o mesmo form aberto em duas estações e salvar ao mesmo tempo um cadastro, como trato a chave? Já que nesse momento as duas estações vão estar com o mesmo código de cliente auto-incremento em memória.

Abraços.

By Ivan George Borges - 3/5/2008

Olá Valadair.

O SF fará isto para você.

Só pra te situar no Help: Application Framework / Business Layer / Common Business Object Tasks / Implementing Concurrency

Para começar, no DDT (Database Deployment Toolkit), click com o botão da direita em sua tabela e click Table Properties. Note a figura abaixo, eu estou ordenando ao DDT que crie as SP para mim, em UPDATE Stored Procedure, eu escolhi em Concurrency "Optmistic Row Version", que é a estratégia que eu quero usar para checar uso concorrente do mesmo registro, e logo abaixo, em Version Field, eu coloquei cli_version, que é um campo Integer que eu crio em minha tabela para cuidar de concorrência.

Ai, quando você criar seu BO para sua tabela de Clientes, você vai nas propriedades de CRUD, e seta o UpdateConcurrencyType para OptimisticRowVersion, e o RowVersionOrTimestampColumn para o seu campo de controle de versão, neste caso cli_version.

Espero que te ajude por aí.

Abraços.

By Ivan George Borges - 3/5/2008

Oi Valdair, desculpa por ter errado seu nome... Blush
By Valdair Ziegler - 3/11/2008

Oi Ivan. Sem problemas....

Segui as dicas que voçê me passou e o Help, implementei a concorrência e funcionaou legal quanto a inserção. Tenho uma outra situação que ainda não consegui resolver.

Como que o SF trata a concorrência durante a edição do mesmo registro. Vamos imaginar que um usuário está com o cadastro de clientes e está editando o cliente Número 10. Ao mesmo tempo temos outro usuário com o cadastro de clientes e também está editando o cliente Número 10. O primeiro altera os dados do endereço, o segundo altera os dados de telefone. como que posso tratar esse tipo de concorrência com SF para que os dados dos dois usuários sejam salvos?

Estou usando "OptimisticRowVersion" com a PK de clientes. ´

By Ivan George Borges - 3/11/2008

Bom, primeiro, só para chamar um pouco a atenção para o detalhe do RowVersion... você não deveria usar a PK do seu cliente, pois este campo de RowVersion será usado pelo StrataFrame para incrementar o número de versão do seu registro. Então, a cada alteração que houver no mesmo, ele será incrementado de 1, e assim que o SF vai saber que houve uma alteração por outro usuário quando você for salvar a sua versão do registro. Então, você deveria criar um campo em cada uma de suas tabelas exclusivamente para esta função, provavelmente do tipo Integer. Por exemplo, na minha tabela de Clientes, ele se chama cli_version.

Aí, quando houver problema de concorrência, seu usuário receberá a seguinte tela quando ele for salvar o registro:

Nesta tela de Diálogo, você tem o valor do seu campo, e o valor que agora está no servidor, já que alguém editou o mesmo registro e salvou antes de você. Neste momento, seu usuário terá que decidir o que irá fazer.

By Ivan George Borges - 3/11/2008

Além disto, faça um Search no Forum com a palavra "concurrency".

Você vai receber links bastante interessantes sobre o assunto.

Abraços.

By Valdair Ziegler - 3/11/2008

Ok Ivan.  Eu de novo.

Caso eu não queira mostrar a janela de decisão ao usuário e preservar os valores atuais do banco como faço?

By Ivan George Borges - 3/11/2008

Valdair Ziegler (03/11/2008)
Ok Ivan.  Eu de novo.

Caso eu não queira mostrar a janela de decisão ao usuário e preservar os valores atuais do banco como faço?

Bom, se você não quer que a janela entre em ação, você pode desligar a propriedade AutoHandleCollisions do form e gerenciar o evento ConcurrencyException você mesmo, tomando as decisões que achar melhor.