Inquiridor
Acesso concorrente

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.
Todas as Respostas
-
-
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,
Adriel Codeco Silva
Email: adriel.silva@uppercase.com.br
MSN: adrielcodeco@hotmail.com
Blog: adrielcodeco.wordpress.com
Uppercase – www.uppercase.com.br -
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 linqpara:
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....