Jump to content


Photo

Travando Registro Com Innobd


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

#1 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 10/01/2011, 07:29

bom dia a todos!!!
pessoal, seguinte:
imagem a query
START TRANSACTION;
select * from tabela where nome like "%teste%";
COMMIT;

Bom, o que quero saber é:
Usando o TRANSACTION ele trava o registro?
destravando, digamos assim, quando na alteração(página seguinte)na páina seguinte, usando o commit??
resumindo a pergunta:
usando apenas o transaction ele trava o registro?em quem momento ele "destrava"?
Meu último trabalho:
http://www.iconsorciofiat.com.br.

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 10/01/2011, 11:47

Precisa acrescentar FOR UPDATE pra travar.

START TRANSACTION;
select * from tabela where nome like "%teste%" for update;
COMMIT;

Ele vai ser destravado no commit. Mas o start transaction não permanece entre os acessos. Assim que a conexão é fechada no fim do script, a transação é encerrada também. Se você pretende usar isso pra fazer um form de edição, não vai funcionar.

#3 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 11/01/2011, 07:25

bom, vamos lá...quero evitar 2 pessoas pegando o mesmo registro...
aí, quando clicar para pegar um novo cliente(registro) executo a query precedida pelo START TRANSACTION,nesse caso especificamente faço um update colocando meu id, no registro(no campo "operador")termino com o commit
NESSE caso, esse registro ficará trancado, o tempo necessário para execução dessas instruções, logo, posso presumir que 2 pessoas não pegarão o mesmo registro ao mesmo tempo, correto????
Abração!!
Horácio
Meu último trabalho:
http://www.iconsorciofiat.com.br.

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 11/01/2011, 11:26

Se é só 1 update, é desnecessário usar transação. Se existe uma rotina mais complexa, que envolve mais de uma query e que pode gerar problema de concorrência, a transação deve ser usada.

#5 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 11/01/2011, 13:27

na verdade, serão 2 processos...
  • um para escolher um cliente...
  • outro para associar ao cliente...
nesse caso, cabe a transação?????
Meu último trabalho:
http://www.iconsorciofiat.com.br.

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 11/01/2011, 13:48

Depende se estamos falando de web ou de desktop. Se o seu sistema for web, você não pode querer dividir isso entre duas páginas. Ex:

escolhe_cliente.php
require 'conexao.php';
mysql_query('START TRANSACTION');
mysql_query("select * from tabela where nome like '%teste%' for update");
// imprime um form com um select e um botao
associa_cliente.php
require 'conexao.php';
mysql_query('UPDATE...');
mysql_query('COMMIT');
Isso não pode. O que pode é:

require 'conexao.php';
mysql_query('START TRANSACTION');
mysql_query("select * from tabela where nome like '%teste%' for update");
// faz algum processamento
mysql_query('UPDATE...');
mysql_query('COMMIT');


#7 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 11/01/2011, 14:36

Me refiro a Web,mesmo...
qual a diferença para Desktop???só isso que não entendi...
entendi...
se tiver uma sequencia de sql, seja ela por exemplo, pesquisa, alterar como nesse caso, ela trava enquanto esses 2 comandos(2 nesse caso, poderiam ser 3,4, 5, 6...)estiverem entre start TRANSACTION e COMMIT...

SE tiver 4(5,1,2,3,30...) comandos sql eles ficarão travados enquanto estiverem entre essas "marcações" e evitarão esses erros de concorrência...
Cara, demais isso!!!

Edição feita por: horacio2009, 11/01/2011, 14:37.

Meu último trabalho:
http://www.iconsorciofiat.com.br.

#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 11/01/2011, 14:45

É, por aí. Só reforçando: isso não pode estar dividido entre dois arquivos. Tem que ser tudo no mesmo.

#9 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 15/01/2011, 07:36

Perfeito, Leob...
Só confirmando...
eu fiz dessa forma:
$tab=mysql_query("START TRANSACTION");      
$tab=mysql_query("UPDATE controle_clientes SET situacao='$status',acompanhamento='$email', atualizacao='$data' WHERE id_vendas='$cliente'");
$tab=mysql_query("COMMIT");

tá certo, assim, né?
No mais, muito obrigado pela força!!!
Meu último trabalho:
http://www.iconsorciofiat.com.br.

#10 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 15/01/2011, 11:03

Pra 1 query só é desnecessário. Pode tirar o start e o commit. A utilidade de transação é:

Suponha que eu esteja fazendo uma loja. Na hora de vender o produto, eu preciso ver se ele está no estoque antes de bater o martelo.

mysql_query("SET ISOLATION LEVEL SERIALIZABLE"); // ver http://dev.mysql.com...-isolation.html

mysql_query("START TRANSACTION");

$query = mysql_query("SELECT qtd FROM produtos WHERE id=$id FOR UPDATE"); // aqui selecionei o produto e travei o registro

// confiro se ele está disponível e qualquer outra coisa pertinente
...

if($pode_vender){
mysql_query('INSERT INTO vendas...'); // faço a venda
mysql_query('UPDATE produtos SET qtd=qtd-1 WHERE id=$id');
}

mysql_query("COMMIT"); // confirmo tudo e destravo o registro

Nesta situação o uso de transação se aplica porque em um sistema com uso intenso, imagine que só tenha 1 produto restante. E duas pessoas tentam comprar praticamente no mesmo instante. Nesta situação, os dois SELECTs acontecem também praticamente no mesmo instante. Assim, o código das duas pessoas vai ler qtd=1 e as vendas serão feitas. Então usamos a transação para travar o registro. Assim, o primeiro que executar o SELECT trava o registro e impede que a segunda pessoa consiga comprar.

#11 horacio2009

horacio2009

    Ativo

  • Usuários
  • 371 posts
  • Sexo:Não informado

Posted 20/01/2011, 08:43

exatamente esse meu problema,...mesmo cliente(lemos produto, nesse caso)para dois operadores...
vi que o código postado "mysql_query("SET ISOLATION LEVEL SERIALIZABLE"); // ver http://dev.mysql.com...isolation.html" é essa a linha que faz o bloqueio do registro???

Se sim, qual a função do "mysql_query("START TRANSACTION");"?
achei que era essa que travava...
Meu último trabalho:
http://www.iconsorciofiat.com.br.

#12 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/01/2011, 10:41

Leia o link.

#13 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 11724 posts

Posted 15/09/2017, 13:33

Cialis Es Con Receta cialis Finasteride 1 Miligramo Propecia Finasterida Generico Resultados Propecia Clomid 3 Comprimes Generico Cialis Farmacia Canadianpharmacies cialis price direct isotretinoin where to order medication without rx West Lothian
Buy Keflex Online cialis Propecia With Minoxidil Nisim Viagra Cialis Naturale Zithromax Z Pak Dosage cialis buy online Dapoxetina Para La Eyaculacion Precoz

#14 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 11724 posts

Posted 04/10/2017, 09:10

Antiphospholipid Syndrome Amoxicillin Cialis E Ipertensione Tooth Abcess And Amoxicillin cialis buy online Cialis For Daily Use No Rx Needed Thyroid Amoxicillin 875 125

#15 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 05/10/2017, 01:41

Priligy Df Canadian Farmacie Prezzo Cialis Levitra eva pills levitra Cialis 5 Mg Buy Cialis Without Prescription




0 user(s) are reading this topic

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

IPB Skin By Virteq