Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, imaginem a seguinte situação: o usuário A clica no botão enviar no mesmo instante que o usuário B, caso a ação do sql seja um comando update no mesmo campo, id=7 por exemplo e isso acontecer exatamente no mesmo instante, ocorre perca de dados?
<?php
$update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'";
$query = mysqli_query($update, $conn) or die (mysqli_error($conn));
if($update==true){
echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>";
}
?>
Se isso acontecer e ocorrer perca de dados, qual o procedimento possível para resolver o problema?>
Em 22/02/2019 at 09:15, Motta disse:
Leia sobre transactions , commits , select for update etc.
[http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/commit.html](http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/commit.html)
[http://www.mysqltutorial.org/mysql-transaction.aspx](http://www.mysqltutorial.org/mysql-transaction.aspx)
[http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/innodb-locking-reads.html](http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/innodb-locking-reads.html)
Valeu Motta, eu nem sabia que existia isso aí, li os documentos e compreendi só um pouco assim no primeiro momento...
Então é só colocar aquele FOR UPDATE ali e estará tudo certo? Mais uma vez, valeu!
<?php
$SELECT = "SELECT id, i, data FROM br_gang FOR UPDATE";
$maka = mysqli_query($SELECT, $conn) or die(mysqli_error($conn));
$update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'";
$query = mysqli_query($update, $conn) or die (mysqli_error($conn));
if($update==true){
echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>";
}
?>O FOR UPDATE impede uma leitura suja
User A troca o ID 1234 , campo X de 1 para 2.
Se o For Udp se o ustio B tentar ler este registro lerá 1 no campo X , com o Upd não lerá até que o COMMIT seja feito e não consiguirá outro FOR UPD.<?php
require("config/dbconnection.php");
mysqli_autocommit ( $conexao , false );
if ( $resultado = mysqli_query ( $conexao , "SELECT @@autocommit" )) {
$linha = mysqli_fetch_row ( $resultado );
if($linha[0]==0){
$update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'";
$query = mysqli_query($update, $conexao ) or die (mysqli_error($conexao));
if($update==true){
echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>";
}
}
mysqli_free_result ( $resultado );
}
mysqli_close ( $conexao );
?>
Ta complicado compreender isso, então tenho de definir mysqli_autocommit= false pra poder fazer UPDATE? Esse script aí vai funcionar para que não ocorra parca de dados?Com autocommit false a aplicação deve dar o commit , leia conceito de transactions , exemplo comum transferir dinheiro de uma conta a outra , dois upds , ou faço ambos ou não faço nenhum.