php - transacciones - la transacción no puede deshacerse en codeingniter
transacciones en codeigniter (6)
RESPUESTA ACTUALIZADA!
Tengo que decirte que la configuración predeterminada de codeigniter es confirmar automáticamente todas las transacciones.
Si por alguna razón quiere deshabilitar esta función, debe usar esta línea:
$this->db->trans_off();
antes de
$this->db->begin();
Dicho eso, así que cuando usas
$this->db->trans_complete();
necesitarás comprometer o revertir, así:
$result = $this->db->trans_complete();
if($result === true){
$this->db->trans_commit();
}else{
$this->db->trans_rollback();
}
Finalmente lo que quieres es:
$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();
}
Estoy trabajando en la transacción, y en el código mencionado tuve algún problema. No comprometí la transacción, pero insertó datos en mi base de datos.
$this->db->trans_begin();
$this->db->insert(''tblorder'',$data);
$orderid=$this->db->insert_id();
foreach ($orderItemList as $orderItemList) {
$orderitem = array(''orderid'' =>$orderid ,''productid'' =>$orderItemList->productid ,''amount'' =>$orderItemList->amount);
$this->db->insert(''tblorderitem'',$orderitem);
}
$this->db->trans_complete();
if ($this->db->trans_status() == 1) {
$this->db->trans_rollback();
return "true";
} else {
$this->db->trans_commit();
return "false";
}
Revertí la transacción, y nuevamente todos los datos fueron insertados en mi base de datos. ¿Cuál debe ser el problema? No puedo entenderlo
Como sé para CI versión 3.0.1, lo único que debe preocuparse es dónde poner $this->db->trans_start();
y $this->db->trans_complete();
Entonces para situaciones como:
$this->db->trans_start();
//any code goes here
$this->db->trans_complete();
La transacción se revertirá si algo sale mal, o se confirmará al llamar a $this->db->trans_complete();
Porque si miras bajo el capó del método trans_start , contiene trans_begin . Y el método trans_complete contiene verificación de trans_status y, en consecuencia, llamadas a los métodos trans_commit o trans_rollback .
Lo mismo aplica para las transacciones anidadas:
$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();
De forma predeterminada, Codeigniter ejecuta todas las transacciones en modo estricto, de modo que el último trans_completo se comprometerá todo, o si algo falla, todas las reversiones.
¿Por qué quieres ROLLBACK
? ¿Es por algo más que un falso trans_status
? Si es así, llame a trans_rollback
antes de llamar a trans_complete
o trans_commit
.
Parece que esto sería óptimo para su situación (disculpas por la sintaxis incorrecta):
trans_start
...
if ( some non-db problem ) trans_rollback
trans_complete
El código que ha escrito es prácticamente el mismo que el de las transacciones automáticas, pero no tan bien. ¿Mi consejo? No intente superar a CodeIgniter, utilice el modo "automático" para las transacciones. Luego, las reversiones, si es necesario, serán atendidas por usted.
He rehecho tu código usando el modo de transacciones automáticas. También $orderItemList
los datos de $orderItemList
para que pueda insertarse usando un lote en lugar de llamar a db->insert
repetitivamente en un bucle.
$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();
Hazlo así. Si desea obtener más información sobre la transacción, verifique Mi respuesta en otra pregunta . Eso te ayuda a tener una idea clara sobre las Transacciones.
$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;
}
No use $this->db->trans_complete();
según la documentación
$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();
}