Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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
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).
você teria como disponibilizar um exemplo pratico dessa operação, que eu possa rodar aqui e entender a sintaxe da coisa toda ?
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 /)
{
else
{