Ir para conteúdo

Arquivado

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

theteo

Primeira vez utilizando commit() e rollback()

Recommended Posts

Boa noite

Pessoal, eu utilizo o código abaixo para fazer duas transações no banco:

 

$sqlinsert = $mysqli->prepare("INSERT INTO tbl_pessoafisica(cpf,senha,nome,email,celular) VALUES (?,?,?,?,?)");
$sqlinsert ->bind_param('sssss', $cpf,$senha,$nome,$email,$cel);
$sqlinsert ->execute();

if($sqlinsert->affected_rows==1){ // se gravou 
			
	$codpf = $sqlinsert->insert_id;
	$sqlinsert->close(); // fecho conexao 
		
	$sqlinsertacesso = $mysqli->prepare("INSERT INTO tbl_acesso (cod_perfil,cod_pf) VALUES (?,?)");
	$sqlinsertacesso->bind_param('ii', $perfil,$codpf);
	$sqlinsertacesso->execute();

	if($sqlinsertacesso->affected_rows==1){ // se gravou na tabela acesso 
		
		$sqlinsertacesso->close();

	}

	else{

		$sqlinsertacesso->close(); 
		$sqldelete = $mysqli->prepare("DELETE FROM pessoafisica where cod_pf = '$codpf'");
		$sqldelete->execute();
		$sqldelete->close();

	}


}

else{
	
	$sqlinsert->close(); 

}

Ou seja, eu gravo na tabela pessoafisica, pego o código inserido, depois tento gravar na outra tabela, se conseguir OK senão DELETO o registro inserido na primeira tabela.

 

Isso está funcionando, mas eu gostaria de UTILIZAR o commit e rollback ( aprender né ?)

 

 

 

Eu gostaria que alguém me desse um exemplo de como eu faria isso:

 

$sqlinsert = $mysqli->prepare("INSERT INTO tbl_pessoafisica(cpf,senha,nome,email,celular) VALUES (?,?,?,?,?)");
$sqlinsert ->bind_param('sssss', $cpf,$senha,$nome,$email,$cel);
$codpf = $sqlinsert->insert_id;
        
$sqlinsert = $mysqli->prepare("INSERT INTO tbl_acessolofe (cod_perfil,cod_pf) VALUES (?,?)");
$sqlinsert->bind_param('is', $perfil,$codpf);
    
Se as duas querys foram executadas
   commit()
SENAO
    rollback()

desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há muito mistério, só é importante entender o que são transações.

 

 

Já, quanto ao código, é simples:

$mysqli->begin_transaction();

/** realiza todos os inserts **/

if (/** condição de sucesso **/)
{
    $mysqli->commit();
}
else
{
	$mysqli->rollback();
}

Caso você queira utilizar try/catch com MySQLi, você pode alterar o report mode de erros tradicionais para exceptions:

$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR;

No mais, eu costumo usar PDO por ter um suporte melhor a orientação à objetos.

 

No link abaixo você encontra um exemplo com a PDO:

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tenho tanta experiência, não consegui assimilar.

 

Como regra:

 

1 FAÇO O PRIMEIRO INSERT

2 PEGO ESSE ID

3 FAÇO O SEGUNDO INSERT

 

SE TUDO DER BOM - OK

 

SENÃO - ERRO E VOLTA TUDO COMO ESTAVA ANTES.

 

Estou tentando achar um exemplo desse tipo de transação, pois ai eu consigo assimilar e adaptar nas outras QUERYS

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo. Quando você realiza as operações dentro de uma transação, todas as alterações pertencem somente a sua transação.

 

Ou seja. Digamos que existam dois usuários utilizando o banco de dados (Usuário A e B), e ambos estão consultando a mesma tabela (de nome Tabela) que contém 3 registros:

-------------------------
| Usuario A | Usuario B |
|-----------------------|
|        Tabela         |
|-----------------------|
| Registro 1            |
| Registro 2            |
| Registro 3            |
-------------------------        

Nesse momento, o usuário A cria uma transação (begin transaction) e insere um novo registro da tabela (Registro 4). O registro vai existir apenas em transação para o usuário A e o usuário B não terá noção de sua existência. O que seria similar a isso:

---------------------------
| Usuario A  |  Usuario B |
|-------------------------|
|         Tabela          |
|-------------------------|
| Registro 1              |
| Registro 2              |
| Registro 3              |
|-------------------------|
|       Transação         |
|-------------------------|
| Registro 4 |            |
---------------------------        

Pois, ambos os usuários estão consultando o banco de dados mais os dados de suas respectivas sessões (transações). E o novo registro do usuário A está apenas em transação.

 

Quando o usuário persiste os dados que estão em transação(commit transaction) esses dados são enviados ao SGBD e, em consequência, ficam disponíveis para todos os usuários.

-------------------------
| Usuario A | Usuario B |
|-----------------------|
|        Tabela         |
|-----------------------|
| Registro 1            |
| Registro 2            |
| Registro 3            |
| Registro 4            |
-------------------------        

Caso houver um erro, você reverte as alterações removendo os dados da transação (rollback transaction).

 

Resumidamente, os passos são os seguintes:

  • Inicia a transação (begin);
  • Realiza todas as consultas/alterações necessárias (select, update, insert, delete);
  • Caso for com sucesso, persiste (commit);
  • Caso ocorrer algum erro, reverte (rollback).

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

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