Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
$MODEL_A-> insert();
$MODEL_B-> insert();
// model A // insert
try {
#beginTransaction;
$statement = $pdo-> prepare( "INSERT INTO A..." );
$statement-> execute();
#commit;// model B // insert
try {
#beginTransaction;
$statement = $pdo-> prepare( "INSERT INTO B..." );
$statement-> execute();
#commit;se model A for inserido com sucesso e model B falhar, como dar um rollback em model A?
Tem como?
sim, isso é o basico, mas ai vira procedual e o MVC vai pro lixo
se eu tenho:
controller/action
$model_A-> insert();
$model_B-> insert();
cada um vai executar a seu tempo, eles nao entram em bloco
o que ao meu ver é errado, pq muitas vezes precisamos executar mais de 1 query em bloco, mas a separacao do MVC complica...
to quebrando a cuca com isso e ta F***
sim, isso é o basico, mas ai vira procedual e o MVC vai pro lixo
Foi apenas uma forma de demonstrar :rolleyes: o controle da transação poderia sim ser feito no Controller, isso não contrária o MVC e no insert() apenas lógica de inserção, nada mais.. é uma das formas mais simples de se fazer explicitamente:
public function saveAction() {
//...
$dao->getConnection()->beginTransaction();
try {
$dao->insert($obj1);
$dao->insert($obj2);
$dao->getConnection()->commit();
} catch(PDOException $e) {
$dao->getConnection()->rollBack();
throw $e;
}
}
Agora se você quiser incrementar e automatizar essa parte da transação no DAO também é possível, você poderia fazer algo assim:
class DAO {
public function insert($obj) {
if (!$pdo->inTransaction()) {
$pdo->beginTransaction();
}
try {
$stmt = $pdo->prepare('...');
$stmt->execute();
} catch(PDOException $e) {
$pdo->rollBack();
throw $e;
}
}
public function flush() {
if ($pdo->inTransaction()) {
$pdo->commit();
}
}
}
Usando..
$dao->insert($obj1);
$dao->insert($obj2);
$dao->flush(); // descarrega no bd
Faça as inserções dentro de um bloco try/catch, se alguma das inserções falharem cairá no catch e fará o rollback, veja:
$pdo->beginTransaction();
try {
} catch(PDOException $e) {
// houve exceção, volta tudo a partir do início da transação