Jump to content


Photo

Lock Table Usando Asp E Oracle


  • Faça o login para participar
3 replies to this topic

#1 acooper

acooper

    Ativo

  • Usuários
  • 368 posts
  • Sexo:Masculino
  • Localidade:Recreio dos Bandeirantes

Posted 08/01/2009, 08:39

Caros, tenho uma aplicação onde estou tendo problema no mesmo momento dois usuários estão fazendo o mesmo procedimento. Com isso em segundo o primeiro da um LOCK TABLE em seguida o próximo fica na espera.

Preciso de algum exemplo em ASP caso seja possível.

BEGIN TRANSACTION
LOCK TABLE XXXX IN SHARE MODE
LOOP INSERT
COMMIT
Andre Figueiredo
Analista de Sistema Senior
Tel.: + 55 - (21) 3824-4698- Cel: + 55 - (21) 9127-2772
E-Mail: andre.figueiredo@veirano.com.br
Skype: andre.figueiredo.veirano.com.br

#2 acooper

acooper

    Ativo

  • Usuários
  • 368 posts
  • Sexo:Masculino
  • Localidade:Recreio dos Bandeirantes

Posted 15/01/2009, 08:16

Caros, não consegui o LOCK TABLE XXXX IN SHARE MODE . Mais também não seria o ideal na aplicação.
Consegui adaptar Conexao.BeginTrans , com isso posso gerar uma mensagem caso tentam gistrar ao mesmo tempo. Assim tem prioridade o primeiro que der Commit e para o outro vai dar o RollBackTrans nos registros gravados.

Para entender melhor o problema e a solução:
Sistema de Reserva Sala de Reunião

I. Dois usuários estavam tentando reservar na mesma Sala e Data, sendo que um deles escolhe todos os Horários e o outro somente alguns Horários.

II. Mesmo o que escolheu todos os Horários enviar segundos antes a solicitação para o Server, a prioridade vai ser do usuário que escolheu menos, por questões de processo da quantidade solicitada.

Obs.: Antes do BeginTrans os registros do usuário que escolheu mais Horários, eram gravados mais pula os Horários que o outro solicitante tinha gravado segundos antes.

Agora além de sempre verificar com SELECT antes do INSERT tenho o BeginTrans, ficando da seguinte forma:

Conexao.BeginTrans

Select Count(*) as Total From Tabela Where .......

IF .........

INSERT

ELSE

VAR_ROLLBACK = 1

END IF


IF VAR_ROLLBACK = 1 THEN

Conexao.RollBackTrans

Msg = "Erro, horário xxxx já reservado!"

ELSE

Conexao.CommitTrans

Msg = "Sucesso!"

END IF
Andre Figueiredo
Analista de Sistema Senior
Tel.: + 55 - (21) 3824-4698- Cel: + 55 - (21) 9127-2772
E-Mail: andre.figueiredo@veirano.com.br
Skype: andre.figueiredo.veirano.com.br

#3 Renan L. Queiroz

Renan L. Queiroz

    Mestre

  • Usuários
  • 690 posts
  • Sexo:Masculino
  • Localidade:Brasilia - DF

Posted 15/01/2009, 08:39

Acho que um try...catch no banco tbm ajudaria,
mas necessitaria da criação de uma stored procedure, para facilitar. ;-)
Fica como sugestão!

Edição feita por: Renan L. Queiroz, 15/01/2009, 08:50.

Especialidade: Desenvolvimento e Banco de Dados.


Este post lhe ajudou? Agradeça: Posted Image


#4 acooper

acooper

    Ativo

  • Usuários
  • 368 posts
  • Sexo:Masculino
  • Localidade:Recreio dos Bandeirantes

Posted 15/01/2009, 09:16

Caro Renan, sugestões sempre são bem vindas.
Só não preferir fazer em PROCEDURE para não ficar dependendo de BANCO, caso queira fazer alguma outra rotinha teria que usar o PL/SQL.

Sendo direto no ASP posso misturar o que for, JAVASCRIPT etc...... Melhor ainda, não preciso ficar dependendo de outros, caso não tenha acesso a PROCEDURE

Valeu mesmo pela atenção.
Por isso que sempre indico esse Fórum.
Andre Figueiredo
Analista de Sistema Senior
Tel.: + 55 - (21) 3824-4698- Cel: + 55 - (21) 9127-2772
E-Mail: andre.figueiredo@veirano.com.br
Skype: andre.figueiredo.veirano.com.br




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq