O erro é que quando dois usuários rodam o procedimento ao mesmo tempo, o sistema gera dois registros. Era para gerar um registro para um usuário e o outro deveria receber alguma mensagem na tela. Acho q preciso trocar o nível de isolamento do sql server.
Citando Rodrigo Scarano <[EMAIL PROTECTED]>: > Além da dica do Leandro, sugiro criar uma tabela para armazentar o último > sequencial disponível pois dependendo do tamanho de sua tabela, a busca com > select max (dentro de uma transação) pode tornar o processo lento. Outra > opção seria utilizar o campo IDENTITY do SQLServer. > > Sds, Rodrigo - Target Sistemas. > -----Mensagem original----- > De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > nome de Leandro Neves > Enviada em: sábado, 14 de maio de 2005 07:51 > Para: sqlwin@virtualand.net > Assunto: Re: [sqlwin] controle de concorrência SQL SERVER > > > Oi, > > Primeiro qual o erro que esta dando ! > Segundo econtrei uma coisa não recomenda no seu codigo. > Pelo que entendi vc esta pegando o valor maximo do registro na tabela e > somando + 1.. so que vc esta fazendo isso na aplicação... tornando possivel > que duas pessoas efetuem o selecet max ao mesmo tempo e venha o mesmo valor. > Assim dois clientes tentaram enviar o mesmo valor para o banco podendo da > erro de primary key. > > Espero ter ajudado. > > > Leandro Neves > > > On 5/13/05, [EMAIL PROTECTED] < [EMAIL PROTECTED]> > wrote: > Amigos, > estou com um problema no sistema, quando dois usuários baixam um cheque > ao mesmo > tempo. Estou utilizando o banco SQL SERVER. > Se alguém tiver um exemplo, eu ficaria grato. > Vou colocar o código q estou utilizando, pois alguém pode descobrir o q > estou > fazendo de errado ou se está faltando alguma coisa. > O código é o seguinte: > ###################################################################### > Set sSql = ' > DECLARE C_MAXIMO CURSOR FOR > SELECT maximo > FROM ' || sTabela || ' FOR UPDATE > OPEN C_MAXIMO > FETCH NEXT FROM C_MAXIMO ' > Call SqlPrepareAndExecute( hSqlGeral, sSql ) > > Set sSql = 'Select maximo from ' || sTabela || ' into :nMax' > Call SqlPrepareAndExecute( hSqlGeral, sSql ) > Call SqlFetchNext( hSqlGeral, nErro ) > > Set sSql = ' > BEGIN > UPDATE ' || sTabela || ' > SET maximo = maximo + 1 > END > > CLOSE C_MAXIMO > DEALLOCATE C_MAXIMO ' > Call SqlPrepareAndExecute( hSqlGeral, sSql ) > ################################################################ > > Grato. > ============================================== > Lista de Centura SQLWindows > Administrador : [EMAIL PROTECTED] > [ http://www.centuraexplorer.com ] > Para sair desta lista mande mensagem para: > [EMAIL PROTECTED] sem nada no Subject e > com o comando a seguir no corpo da msg: > "unsubscribe sqlwin" (sem as aspas) > ============================================== > > > ============================================== Lista de Centura SQLWindows Administrador : [EMAIL PROTECTED] [ http://www.centuraexplorer.com ] Para sair desta lista mande mensagem para: [EMAIL PROTECTED] sem nada no Subject e com o comando a seguir no corpo da msg: "unsubscribe sqlwin" (sem as aspas) ==============================================