Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

_ P A K O _

Travar Tabela ou Campo

Recommended Posts

Fala galera,bem, minha dúvida é a seguinte:Eu estou desenvolvendo um aplicativo no qual será acessado por múltiplos usuários ao mesmo tempo.Existe uma tela na qual eu tenho que dar um max num id e depois somar mais um para inserir na tabela. Meu problema é o seguinte mais de uma pessoa pode acessar esta tela ao mesmo tempo e com isso, irá pegar o mesmo número do id, fazendo assim uma duplicidade de id.Como eu faço para o primeiro que acessar a tela, bloqueia o registro atual e o outro só consiga ver o id atual, após o anterior ter feito o insert na tabela.Em outras palavras, como eu bloqueio a tabela ou o campo id, só liberando após o usuário abandoná-la ou executar o insert ?Obrigado,P@KO

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que usando o global.asa você consegue. Pelo que entendi, o usuario acessa e recebe o id do proximo registro, ficando assim inacessivel por outro usuario. Pense no seguinte, se durante uma queda de luz, ou simplesmente o usuario não finaliza a atividade em 4 horas(por exemplo), seu sistema se torna inoperante para os outros.Você não pode retornar esse id após o cadastro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que usando o global.asa você consegue. Pelo que entendi, o usuario acessa e recebe o id do proximo registro, ficando assim inacessivel por outro usuario. Pense no seguinte, se durante uma queda de luz, ou simplesmente o usuario não finaliza a atividade em 4 horas(por exemplo), seu sistema se torna inoperante para os outros.Você não pode retornar esse id após o cadastro?

Jonatha,Eu não trabalho com global.asa, como seria neste caso ?Retornar o id após o cadastro, como assim ? Eu faço um insert numa tabela e tenho que saber em qual id eu vou precisar inserir, por isso eu acho que não tem como retornar o id após o cadastro.Entendeu ?AbraçoP@KO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo beleza contigo?

 

Num entendi muito bem... Mas é tipo, o primeiro usuário que acessar a página vai registrar uma ID no bd ai os outros usários só poderão fazer a mesma coisa depois q o 1° sair?

 

Se for cara, vou te passar uma lógica, num sei se tá certo, faz maior tempão que naum programo, mas tenta lá, seguinte:

 

Campos na tabela, ex:

ID < Aqui registra a ID

Status < Aqui registro o status, tipo 1 para quando está bloqueado e 0 para quando está livre

 

Ai quando o primeiro usuario acessar, vai inserir a ID e mudar o Status para 1 e cria uma sessão para trabalhar com o global.asa. Ai com um IF os outros usários só poderão visualizar, pois está bloqueado (1)

 

Quando o usuário sair, que vai finalizar a sessão, no global.asa, muda o Status para 0 (liberado)

 

Acho que expliquei meio confuso, mas qualquer coisa fala aê.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, tudo beleza contigo?

 

Num entendi muito bem... Mas é tipo, o primeiro usuário que acessar a página vai registrar uma ID no bd ai os outros usários só poderão fazer a mesma coisa depois q o 1° sair?

 

Se for cara, vou te passar uma lógica, num sei se tá certo, faz maior tempão que naum programo, mas tenta lá, seguinte:

 

Campos na tabela, ex:

ID < Aqui registra a ID

Status < Aqui registro o status, tipo 1 para quando está bloqueado e 0 para quando está livre

 

Ai quando o primeiro usuario acessar, vai inserir a ID e mudar o Status para 1 e cria uma sessão para trabalhar com o global.asa. Ai com um IF os outros usários só poderão visualizar, pois está bloqueado (1)

 

Quando o usuário sair, que vai finalizar a sessão, no global.asa, muda o Status para 0 (liberado)

 

Acho que expliquei meio confuso, mas qualquer coisa fala aê.

 

Abraço

Fala Rodrigo, Blza ?

 

Bem, o meu problema é o seguinte:

 

Eu tenho um sistema no qual vários usuário acessam ao mesmo tempo, e existe uma tela de cadastrar cliente, a qual vários usuário podem cadastrar um cliente. Então, imaginemos que 2 usuário, clique em cadastrar cliente ao mesmo tempo(Lembrando que um usuário digitou o cliente João e o outro o cliente Maria). O que o sistema faz: Faz um select max na tabela cliente e verifica o maior registro, porém, se os dois clicarem ao mesmo tempo, o mesmo número de ID_cliente será cadastrado tanto para Maria quanto para o João, quando na realidade isso não poderia acontecer.

 

Entendeu ?

 

Gostaria de saber como travar a tabela na hora em que 1 usuário foi nela para fazer o max e só liberar depois do update ou do time out.

 

Abraço.

 

P@KO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pergunta:Como funciona a sua tela? Ao entrar na tela, mesmo antes de salvar, você já exibe o valor do código do cliente? Ou você obtem o mesmo apenas na hora de realmente salvar, depois que o usuário clica no botão?Se for a primeira opção, sugiro que você crie uma tabela auxiliar apenas para armazenar o último ID. Assim, ao invés de buscar na tabela de cliente o máximo ID, você buscaria nessa tabela auxiliar e logo depois somaria 1 nessa tabela, independente de depois o usuário salvar ou não. Essa solução garante não duplicidade, porém você vai ter alguns números ID "perdidos", quando alguém começar a cadastrar um cliente e não terminar, por exemplo. Acredito que isso não chegue a ser problema.No segundo caso, acredito que o ideal é você utilizar controle de transação para contornar o problema de concorrência. Assim quem chegar primeiro salva tudo, quem chegar depois, não salva nada. Seu banco estará sempre íntegro.Mas nesse caso, como as operações de banco de dados são bem rápidas, e tudo será executado em sequencia após clicar em salvar, seria muito difícil ocorrer o problema de concorrência.Essa segunda solução é a que eu considero ideal.Acredito até que existam soluções onde você pode dar um LOCK na tabela, porém isso raramente é indicado.AbraçoCassiano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pergunta:Como funciona a sua tela? Ao entrar na tela, mesmo antes de salvar, você já exibe o valor do código do cliente? Ou você obtem o mesmo apenas na hora de realmente salvar, depois que o usuário clica no botão?Se for a primeira opção, sugiro que você crie uma tabela auxiliar apenas para armazenar o último ID. Assim, ao invés de buscar na tabela de cliente o máximo ID, você buscaria nessa tabela auxiliar e logo depois somaria 1 nessa tabela, independente de depois o usuário salvar ou não. Essa solução garante não duplicidade, porém você vai ter alguns números ID "perdidos", quando alguém começar a cadastrar um cliente e não terminar, por exemplo. Acredito que isso não chegue a ser problema.No segundo caso, acredito que o ideal é você utilizar controle de transação para contornar o problema de concorrência. Assim quem chegar primeiro salva tudo, quem chegar depois, não salva nada. Seu banco estará sempre íntegro.Mas nesse caso, como as operações de banco de dados são bem rápidas, e tudo será executado em sequencia após clicar em salvar, seria muito difícil ocorrer o problema de concorrência.Essa segunda solução é a que eu considero ideal.Acredito até que existam soluções onde você pode dar um LOCK na tabela, porém isso raramente é indicado.AbraçoCassiano.

Fala Cassiano,Bem, no meu caso é a segunda opção, ele recupera o id_cliente quando clicar no botão salvar.O que seria controle de transação ? Poderia me dar um exemplo ?Eu estou utilizando cursor para tentar resolver este problema. Ex: Na hora que for fazer o max na tabela de cliente, eu faço assim:sql= "select isnull(max(id_solicitacao), 0) + 1 as max from cliente"set rs= Server.CreateObject("ADODB.Recordset")rs_rs.CursorLocation = 3rs_rs.CursorType = 0rs_rs.LockType = 3rs_rs.open sql, conexao_bancoIsso estaria correto ?AbraçoP@KO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu entender melhor..O seu campo id_solicitacao não poderia ser identity (auto-numeração)??Caso não possa, acredito que a forma que você está fazendo para obter o próximo ID esteja correta.Para fazer o controle de transação, sugiro que você faça uma busca aqui no forum mesmo, que existem exemplos. Ou no google, pesquisando por ASP controle de transacao.Uma situação comum parecida com a sua em que controle de transação é indicado é a seguinte:Suponha que ao cadastrar um cliente, você precise salvar os dados do endereço dele em uma outra tabela, e a ligação entre elas é o ID do cliente.você tem então 3 passos a fazer:1- Incluir dados do cliente na tabela de clientes;2- Obter o ID do cliente que acabou de ser incluído (último ID)3- Incluir dados do endereço do cliente na tabela de endereços usando o ID obtido no passo 2.Se você não usar controle de transação e ocorrer um erro no passo 2, o cliente vai estar gravado, e o endereço não.. ou seja, você perdeu integridade nos dados. O controle de transação impede que isso ocorra. Se der erro no passo 2 ou 3 por algum motivo, o passo 1 é desfeito.No seu caso, não tenho certeza se você obtem o máximo ID antes de incluir (caso seu campo ID na tabela não seja auto numeração) ou se você quer obter o ID para incluir depois em outras tabelas. Se for o primeiro caso, nem é necessário fazer controle de transação.. basta você obter o ID como já está fazendo e incluir (ou setar o campo ID como auto-numeração, se for possível). Se você estiver realizando várias operações de INSERT ou UPDATE em sequencia, aí sim, vale o controle de transação.AbraçoCassiano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala galera,

 

bem, minha dúvida é a seguinte:

 

Eu estou desenvolvendo um aplicativo no qual será acessado por múltiplos usuários ao mesmo tempo.

Existe uma tela na qual eu tenho que dar um max num id e depois somar mais um para inserir na tabela. Meu problema é o seguinte mais de uma pessoa pode acessar esta tela ao mesmo tempo e com isso, irá pegar o mesmo número do id, fazendo assim uma duplicidade de id.

 

Como eu faço para o primeiro que acessar a tela, bloqueia o registro atual e o outro só consiga ver o id atual, após o anterior ter feito o insert na tabela.

 

Em outras palavras, como eu bloqueio a tabela ou o campo id, só liberando após o usuário abandoná-la ou executar o insert ?

 

Obrigado,

 

P@KO

 

Kra, meu coselho é o seguinte.

Cria uma trigger de lock

CREATE TRIGGER trLockTable ON <<tabela>>
FOR INSERT,UPDATE,DELETE
AS
	ROLLBACK
	PRINT 'Esta tabela está travada no momento.'

Aí qnd tu for dar o select tu ativa essa trigger

ALTER TABLE <<tabela>> ENABLE TRIGGER trLockTable
depois tu desativa a trigger

[ALTER TABLE <<tabela>> DISABLE TRIGGER trLockTable]
pronto aí tu garante que não vai gerar alterações na tabela enquanto a trigger estiver ativa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seja bem-vindo ao Fórum Wagner Leão.

 

Obrigado por contribuir com a possível solução, mas esse tópico é muito antigo. Procure ajudar em dúvidas recentes.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.