2017-08-31 1 views
4

Je travaille sur la transaction, et dans le code mentionné j'ai fait face à un problème. Je n'ai pas validé la transaction, mais j'ai inséré des données dans ma base de données. J'ai annulé la transaction, et de nouveau toutes les données ont été insérées dans ma base de données. Quel doit être le problème? Je ne peux pas l'avoir.transaction ne peut pas restaurer dans codeingniter

Répondre

2

RÉPONSE MISE À JOUR!

Je dois vous dire que la valeur par défaut de config de codeigniter est de valider automatiquement toutes les transactions.

Si pour une raison quelconque vous souhaitez désactiver cette fonction, vous devez utiliser cette ligne:

$this->db->trans_off();  

avant de

$this->db->begin(); 

dit, donc lorsque vous utilisez

$this->db->trans_complete(); 

vous devrez valider ou annuler, comme ceci:

$result = $this->db->trans_complete(); 

if($result === true){ 
    $this->db->trans_commit(); 
}else{ 
    $this->db->trans_rollback(); 
} 

Enfin ce que vous voulez est:

$this->db->trans_off(); 

$this->db->query("insert this..."); 
$this->db->query("insert that..."); 

$result = $this->db->trans_complete(); 

if($result === true){ 
    $this->db->trans_commit(); 
}else{ 
    $this->db->trans_rollback(); 
} 
+0

Je veux une transaction d'annulation que ce qui va faire? –

+0

Vous vous trompez sur l'utilisation de 'trans_off()'. Une fois cette opération terminée, aucune autre méthode 'trans_' ne sera exécutée. Eh bien ... techniquement, ils s'exécutent mais une fois qu'ils voient que 'trans_off()' a été appelé, ils retournent immédiatement FAUX. – DFriend

2

Comme je sais que pour la version CI 3.0.1 la seule chose que vous devriez vous inquiéter est où mettre $this->db->trans_start(); et $this->db->trans_complete();

Donc, pour des situations comme :

$this->db->trans_start(); 
//any code goes here 
$this->db->trans_complete(); 

Transaction sera annulée en cas de problème, ou sera commis sur appel à $this->db->trans_complete();

Parce que si vous regardez sous le capot de méthode trans_start contient trans_begin. Et méthode trans_complete contient chèque trans_status et appelle en conséquence à trans_commit ou trans_rollback méthodes.

même pour les transactions imbriquées:

$this->db->trans_start(); 
//any code goes here 
$this->db->trans_start(); 
//any code goes here 
$this->db->trans_complete(); 
//any code goes here 
$this->db->trans_complete(); 

Par défaut Codeigniter exécute toutes les transactions en mode strict ainsi de suite dernier trans_complete tous seront engagés, ou si quelque chose tombe en panne tous les rollbacks.

2

Pourquoi voulez-vous ROLLBACK? Est-ce à cause de quelque chose autre d'un faux trans_status? Si oui, appelez trans_rollbackavant en appelant trans_complete ou trans_commit.

Il semble que ce serait mieux adaptée à votre situation (mes excuses pour une syntaxe incorrecte):

trans_start 
... 
if (some non-db problem) trans_rollback 
trans_complete 
5

Ne pas utiliser $this->db->trans_complete();

selon documentation

$this->db->trans_begin(); 

$this->db->query('AN SQL QUERY...'); 
$this->db->query('ANOTHER QUERY...'); 
$this->db->query('AND YET ANOTHER QUERY...'); 

if ($this->db->trans_status() === FALSE) 
{ 
     $this->db->trans_rollback(); 
} 
else 
{ 
     $this->db->trans_commit(); 
} 
2

Faites comme ce. Si vous voulez en savoir plus sur la transaction Check My answer on another question. Cela vous aide à avoir une idée claire des Transactions.

$this->db->trans_begin(); 

$this->db->insert('tblorder',$data); 
$orderid=$this->db->insert_id(); 

$orderitem = array(); 

foreach ($orderItemList as $orderItemList) 
{ 
    $orderitem[] = array('orderid' =>$orderid ,'productid' =>$orderItemList->productid ,'amount' =>$orderItemList->amount); 
} 

$this->db->insert_batch('tblorderitem', $orderitem); 

$this->db->trans_complete(); 

if ($this->db->trans_status() === FALSE) 
{ 
    $this->db->trans_rollback(); 
    return FALSE; 
} 
else 
{ 
    $this->db->trans_commit(); 
    return TRUE; 
} 
2

Le code que vous avez écrit est à peu près la même chose que les transactions automatiques sens sont écrits - ne pas aussi bien. Mon conseil? N'essayez pas de déjouer CodeIgniter, utilisez le mode "automatique" pour les transactions. Ensuite, les rollbacks, si nécessaire, seront pris en charge pour vous.

J'ai refait votre code en utilisant le mode de transaction automatique. Je recueille également les données de $orderItemList de sorte qu'il peut être inséré en utilisant un lot au lieu d'appeler db->insert répétitivement dans une boucle.

$this->db->trans_start(); 
$this->db->insert('tblorder', $data); 
$orderid = $this->db->insert_id(); 
foreach($orderItemList as $orderItem) 
{ 
    $orderedItems[] = [ 
     'orderid' => $orderid, 
     'productid' => $orderItem->productid, 
     'amount' => $orderItem->amount 
    ]; 
} 
if(isset($orderedItems)) 
{ 
    $this->db->insert_batch('tblorderitem', $orderedItems); 
} 
$this->db->trans_complete(); 
$this->db->trans_status();