none
Concorrência de Dados - Oracle RRS feed

  • Pergunta

  • Senhores, boa tarde.

     

    O problema é o seguinte:

     

    Tenho 3 tabelas, A, B e C.

     

    Tenho que pegar um valor em reais de A, fazer um cálculo com este valor e inserir sua chave como FK em B e C.

     

    Ocorre é que existem várias instâncias da classe, portanto, a primeira pega o valor de A de R$ 100,00 e faz o cálculo com este valor, mas ao mesmo tempo, a segunda instância também pegou este mesmo valor e fez o cálculo, o que é incorreto, já que deve-se deduzir do valor que foi atualizado mais recentemente, seja o da primeira ou da segunda instância.

     

    Como fazer este tratamento na classe System.Data.OleDb? A base de dados deve sofrer alguma configuração?

     

    Desde já agradeço.
    sexta-feira, 18 de janeiro de 2008 17:45

Todas as Respostas

  • Boa Noite,

     

    Esse é um clássico dilema de concorrência vs consistência. Se você permitir uma maior concorrência, a consistência é afetada e vice-versa. Você pode tratar isso aumentando a consistência através dos níveis de isolamento. Para garantir isso através do ADO.NET através da classe OleDBTransaction do Named Space System.Data.OleDb

     

    Se você elevar o nível de isolamento de ReadCommited (Default) para RepeatableRead ou Serializable, a consistência ficará garantida, mas se muitos usuários precisarem acessar (concorrência) pode haver enfileiramento. Você pode fazer esse tratamento também no banco se preferir.

     

    [ ]s,

     

    Gustavo

    sexta-feira, 18 de janeiro de 2008 20:41
  •  

      Uma sugestão:

     

    Eu teria um atributo do tipo timestamp na classe (data e hora) e ao salvar o registro verificaria se a data armazenada no banco de dados ainda é a mesma. Com isso posso garantir que o registro atual (carregado em memória) não foi atualizado por outra pessoa. Com isso garanto a integridade do registro e não tenho nenhum problema de performance no banco de dados.

     

    segunda-feira, 21 de janeiro de 2008 17:55