Saltar al contenido

Transacciones Codeigniter

Hola usuario de nuestro sitio web, descubrimos la solución a lo que buscabas, deslízate y la encontrarás más abajo.

Utilizando transactions Significa apoyar bases de datos para insertar datos de forma segura. Entonces en Codeigniter escribimos cada funciones relacionadas con la base de datos en el Modelo no en Controller.. Y en su segundo código (que no funciona) ha señalado el modelo allí. (utils). Tan simple que estoy seguro de que esto no funcionará. Porque no es una inserción de datos con el modelo y el controlador en paralelo. La transacción debe codificarse en el modelo (Escribiré en modelo en mi respuesta).


Cargue esto también

  1. Biblioteca de base de datos
  2. Clase de modelo
  3. Asistente de URL
  4. Sesión

Supuestos

En tu código has usado $data y $test como array. Entonces supongo que hay dos array para insertar y actualizar datos.


Tus conjuntos de datos

$data = array(
   'title' => 'My title' ,
   'name' => 'My Name' ,
   'date' => 'My date'
);

$id = 007;
$test = array(
   'title' => $title,
   'name' => $name,
   'date' => $date
);

Tu codigo

$this->db->trans_start(); # Starting Transaction
$this->db->trans_strict(FALSE); # See Note 01. If you wish can remove as well 

$this->db->insert('table_name', $data); # Inserting data

# Updating data
$this->db->where('id', $id);
$this->db->update('table_name', $test); 

$this->db->trans_complete(); # Completing transaction

/*Optional*/

if ($this->db->trans_status() === FALSE) 
    # Something went wrong.
    $this->db->trans_rollback();
    return FALSE;
 
else 
    # Everything is Perfect. 
    # Committing data to the database.
    $this->db->trans_commit();
    return TRUE;


Notas

  1. De forma predeterminada, Codeigniter ejecuta todas las transacciones en modo estricto. Cuándo
    el modo estricto es activado, si está ejecutando varios grupos de transacciones, si un grupo falla, todos los grupos se revertirán. Si el modo estricto es discapacitado, cada grupo es tratado de forma independiente, lo que significa que la falla de un grupo no afectará a los demás.

Lo que intenté fue más un truco, pero funcionó para mí.

$this->db->trans_begin();
  $rst1=  $this->utils->insert_function($data);
  $rst2 =  $this->utils->update_function2($test);
if($this->db->trans_status() === FALSE || !isset($rst1) || !isset($rst2))
   $this->db->trans_rollback();
else
   $this->db->trans_commit();

Sospecho que el problema tiene que ver con la forma en que CodeIgniter maneja los objetos.

Si va a la documentación de CI en la sección “Creación de bibliotecas” en:

http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html
y mira la sección relacionada con:

$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');

En su controlador principal, ha cargado / instanciado la clase de la base de datos usando la carga automática o cargando explícitamente la clase.

Luego continúa y abre la transacción, y luego, accede a las funciones de su base de datos a través de su biblioteca de utils.

Sin embargo, una vez que use $this-db en su biblioteca, en realidad está accediendo a otra copia de la instancia de la base de datos, NO a la que está asociada con su transacción.

Para acceder a la misma instancia, debe usar la función get_instance ().

Creo que eso debería solucionar tu problema. Su estilo de codificación original para separar la función en varios módulos es excelente. Simplemente necesita comprender este detalle adicional.

Intente y confirme que la reversión funciona como espera.

Las entrañas del código consisten en el siguiente controlador:

$this->db->trans_start();
$this->User_profile_m->create_new_user_profile();
$this->User_profile_m->create_new_user();
$this->db->trans_complete(); 

y un modelo simple user_profile_m para hacer frente a la persistencia de datos:

function create_new_user()

    $data['user_name_usr'] = $this->input->post('user_name');
    $data['create_date_usr'] = NULL;

    $this->db->insert('user_usr', $data);  


function create_new_user_profile()

    $data['user_name_pro'] = $this->input->post('user_name');
    $data['user_description_pro'] = $this->input->post('user_description');
    $data['create_date_pro'] = NULL;

    $this->db->insert('user_profile_pro', $data);  

Básicamente, la demostración intenta hacer dos inserciones (una en cada una de las dos tablas). Si un inserto falla, el otro se revierte.

Construí esto en CodeIgniter 2.1.3 y puedo hacer que los archivos de la aplicación estén disponibles a través de GitHub o comprimirlos y enviárselos.

valoraciones y comentarios

Si guardas algún contratiempo y forma de aumentar nuestro división puedes dejar una explicación y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *