una ultimo tabla registro obtener mostrar last_insert_id insertado ejemplo como mysql codeigniter transactions pdo

ultimo - ¿Cómo funciona el último ID de inserción de mysql con las transacciones?+preguntas de transacción



obtener ultimo id insertado mysql php (1)

Para responder a tu primera pregunta ...

Al usar transacciones, sus consultas se ejecutan normalmente en lo que respecta a su conexión. Puede elegir comprometer, guardar esos cambios o deshacer, revertir todos los cambios. Considere el siguiente pseudo-código:

insert into number(Random_number) values (rand()); select Random_number from number where Number_id=Last_insert_id();

// php

if($num < 1) $this->db->query(''rollback;''); // This number is too depressing. else $this->db->query(''commit;''); // This number is just right.

El número aleatorio que se generó se puede leer antes de confirmar para asegurarse de que sea adecuado antes de guardarlo para que todos lo vean (por ejemplo, confirmar y desbloquear la fila).

Si el controlador PDO no funciona, considere usar el controlador mysqli. Si esa no es una opción, siempre puede usar la consulta ''select last_insert_id () como id;'' en lugar de la función $ this-> db-> insert_id ().

Para responder a su segunda pregunta, si está insertando o actualizando datos que otros modelos estarán actualizando o leyendo, asegúrese de usar las transacciones. Por ejemplo, si una columna ''Number_remaining'' está configurada en 1, puede ocurrir el siguiente problema.

Person A reads 1 Person B reads 1 Person A wins $1000! Person A updates 1 to be 0 Person B wins $1000! Person B updates 0 to be 0

Usar transacciones en la misma situación arrojaría este resultado:

La persona A comienza la transacción
La persona A dice ''1'' de Number_remaining
(La fila ahora está bloqueada si se usa seleccionar para actualizar )
La persona B intenta leer Number_remaining - forzado a esperar
La persona A gana $ 1000
La persona A actualiza 1 para ser 0
La persona A se compromete
La persona B lee 0
La persona B no gana $ 1000
Persona B llora

También es recomendable que lea los niveles de aislamiento de las transacciones .

Tenga cuidado con el punto muerto, que puede ocurrir en este caso:

La persona A lee la fila 1 ( select ... for update )
La persona B lee la fila 2 ( select ... for update )
La persona A intenta leer la fila 2, obligada a esperar
La persona B intenta leer la fila 1, obligada a esperar
La persona A llega a innodb_lock_wait_timeout (50 segundos predeterminados) y está desconectada
La persona B lee la fila 1 y continúa normalmente

Al final, dado que la Persona B probablemente haya alcanzado max_execution_time de PHP, la consulta actual finalizará la ejecución independientemente de PHP, pero no se recibirán más consultas. Si se trata de una transacción con autocommit = 0, la consulta se revertirá automáticamente cuando se corte la conexión a su servidor PHP.

Una pregunta de dos partes:

  1. En mi script CodeIgniter, estoy comenzando una transacción, luego insertando una fila, estableciendo el insert_id () en una variable php, insertando más filas en otra tabla usando la nueva ID como una clave externa, y luego confirmo todo.

    Entonces mi pregunta es: si todo no se confirma antes de finalizar la transacción, ¿cómo es posible que mysql pueda devolver la última ID de inserción, incluso si no se insertó nada? Mi script funciona (casi) perfectamente, con la nueva identificación que se utiliza en consultas posteriores.

    (Digo "casi" porque, usando el controlador PDO mysql, a veces se duplica la primera inserción que se supone que devuelve insert_id (), se inserta dos veces. ¿Alguna idea de por qué sería eso? ¿Eso está relacionado con obtener la última? ID? Nunca sucede si se usa el controlador mysqli o mysql.)

  2. Primero escribí el script sin transacciones, por lo que tengo un código que comprueba si hay errores de mysql en el camino, como por ejemplo:

    if(!$this->db->insert($table, $data)) { //log message here }

    ¿Cómo afecta esto al proceso de mysql una vez que envolví todo mi código mysql en una transacción? No está causando ningún error visible (con suerte sin relación con el problema mencionado anteriormente), pero ¿debería eliminarse?

Gracias.