none
Acesso concorrente RRS feed

  • Pergunta

  • Olá senhores estou com um problema de concorrência em uma app ASP.NET.

    Tenho um método que realiza as funcões:

    1) Verifica se o cliente possui saldo em uma linha do banco de dados para realizar operação, via linq

    2) Retorna dado de fonte externa

    3) Atualiza, via linq, o saldo na mesma linha do banco de dados

    4) Grava dados da fonte externo via linq

     

    Pensei em fazer com Transação do Tipo:

     DataContextX.Current.Connection.Open();
    DbTransaction trans = SicSystemDataContext.Current.Connection.BeginTransaction();
    DataContextX.Current.Transaction = trans;

    // Trecho de código


    DataContextX.Current.Transaction.Commit();

    DataContextX.Commit();

     

    ou usando o comando lock.

     

    Minha pergunta é se tanto o uso de transação ou lock vão bloquear o acesso concorrente a classe e se há outras sugestões.

     

    Obrigado.

     

     

     

     

     

    quinta-feira, 8 de julho de 2010 13:27

Todas as Respostas

  • Acho melhor com o lock sim o lock bloqueia acesso a classe, a transaction podem ocorrer juntas
    quinta-feira, 8 de julho de 2010 18:01
  • Hi,

    Voce pode conficurar o acesso concorrente na construcao do seu service como no exemplo abaixo.

    o opcao ConcurrencyMode = ConcurrencyMode.Single forca uma fila para executar esse metodo, o acesso e de apenas uma chamada por vez.

    [ServiceContract]
    public interface IContrato
    {
      [OperationContract]
      string Ping(string value);
    }
    
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
    class Servico : IContrato
    {
      private Dictionary<int, string> _dic = new Dictionary<int, string>();
      private int _contador;
    
      public string Ping(string value)
      {
        lock (_dic)
        {
          _dic.Add(_contador, value);
          Thread.Sleep(200);
          _contador++;
          return _contador.ToString();
        }
      }
    }
    

     

    Att,


    codeco Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br
    sexta-feira, 6 de agosto de 2010 22:34
    Moderador
  • Outra coisa... vc nao pode inverter a ordem desse processo ?

    1) Verifica se o cliente possui saldo em uma linha do banco de dados para realizar operação, via linq
    2) Retorna dado de fonte externa
    3) Atualiza, via linq, o saldo na mesma linha do banco de dados
    4) Grava dados da fonte externo via linq

    para:

    1) Retorna dado de fonte externa
    2) inicia a transação
    3) Verifica se o cliente possui saldo em uma linha do banco de dados para realizar operação, via linq
    4) Atualiza, via linq, o saldo na mesma linha do banco de dados
    5) Grava dados da fonte externo via linq
    6) Commit...

    Dessa forma o processamento mais demorado fica fora da sua transação



    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sábado, 7 de agosto de 2010 01:43
    Moderador