Ir para conteúdo
Fórum Script Brasil
  • 0

Lock Tabela


Guest --Marcos --

Pergunta

Guest --Marcos --

Ola Amigos

Estou com um problema, veja a sequência de eventos:

cliente1:

begin transaction

update produto set estoque = 2 where codigo = 25

O usuario abre uma janela pedidndo para ele entrar com varios campos, o que demora para ser preencihido

(Note que a transção esta aberta , NÂO FOI DADO COMMIT)

cliente2:

begin transaction

update produto set estoque = 1 where codigo = 12

Oque acontece é que cliente 2 trava nessa hora, pois ele fica esperando cliente 1 dar um commit ou rollback, ou seja cliente1 trava a tabela produto para update.

Mas eu gostaria que o bloqueio fosse a nivel de registro (pois são registros diferentes) e não a nível de tabela.

Como resolver?

Obrigado

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
Ola Amigos

Estou com um problema, veja a sequência de eventos:

...

Mas eu gostaria que o bloqueio fosse a nivel de registro (pois são registros diferentes) e não a nível de tabela.

Como resolver?

Obrigado

Oi, Marcos!

Por padrão o engine InnoDB do MySQL, a partir da versão 4.1x, utiliza o bloqueio por registros no lugar de bloqueio por tabelas.

Verifique o Manual do MySQL 4.1 para mais detalhes.

Uma outra técnica que você poderia usar seria a criação de tabela semáforo que contivesse os campos usuário, tabela e registro.

(Eu uso esta técnicaem diversas ocasiões inclusive para evitar que o mesmo usuário se logue em 2 ou mais máquinas simultaneamente)

Esta técnica é descrita conforme o Caso de Uso abaixo:

1 - Usuário "A" seleciona o registro (vou usar seu exemplo) com o código 25 da tabela de estoque.

2 - Sistema insere um registro na tabela semáforo (usuario="A", tabela = "estoque", registro=25)Este procedimento informa que este registro está em processo de alteração.

3 - Usuário começa o processo de digitação e seu sistema vai armazenando isto em variáveis

4 - Usuário confirma a gravação

5 - Sistema dá START TRANSACTION faz as operações de gravação e encerra com COMMIT ou ROLLBACK

6 - Em ambos os casos COMMIT ou ROLLBACK sistema informa sucesso ou fracasso e libera o semáforo deletando o registro referente àquele usuário.

7 - Fim Caso de Uso

Vantagens

A qualquer momento seu banco de dados estará livre para consultas e gravações

O registro estará bloqueado e acessível a consulta por outros usuários que saberão que na tabela "estoque" o registro com campo chave 25 está sendo atualizado pelo usuário "A"

O tempo de gravação de registro independe do tempo do usuário, que pode ter ido ao banheiro, falar com o chefe ou atender telefone, por exemplo.

Desvantagem

Se o sistema cair por algum motivo o semáforo não será desarmado ficando marcado que está em uso. Neste caso, você deverá criar um algorítimo em que isto possa ser desfeito automaticamente, após algum tempo ou manualmente.

Dica: NUNCA dê a chance para que o usuário trave o sistema e diga que o problema é seu.

att

Denis Courcy

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...