sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo funciona obtener la última ID de inserción de mysql con las transacciones? + preguntas sobre transacciones

Para responder a tu primera pregunta...

Al usar transacciones, sus consultas se ejecutan normalmente en lo que respecta a su conexión. Puede elegir confirmar, guardar esos cambios, o retroceder, revirtiendo todos los cambios. Considere el siguiente pseudocó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 la confirmación para garantizar 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() as 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 actualizarán o leerán, asegúrese de usar transacciones. Por ejemplo, si una columna 'Número_restante' se establece 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

El uso de transacciones en la misma situación daría este resultado:

Es posible que desee leer sobre niveles de aislamiento de transacciones también.

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

Al final, dado que la Persona B probablemente alcanzó el max_execution_time de PHP , la consulta actual terminará de ejecutarse 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 con su servidor PHP.