Si te ha pasado como a mi, que estás tranquilamente probando a hacer cosas nuevas en Laravel 8, y de repente te das cuenta que, aunque las defines de forma manual, no funcionan las transacciones, y aunque provoques un rollback en todas tus operaciones, estas se graban en base de datos, con un código similar a este:
DB::beginTransaction(); try { $tabla->update($datos); DB::rollback(); } catch (\PDOException $e) { DB::rollback(); }
El problema está en MySQL y en el tipo de motor de tabla que tienes definida. Si tienes como motor de tus tablas MyISAM, no admite transacciones, por lo que deberás cambiar todas tus tablas al motor InnoDB y así podrás hacer uso de las transacciones en Laravel.
Para ello, tienes que realizar los siguientes pasos:
1.- Abrir el fichero de tu app config/database.php y en tu conexión poner lo siguiente:
‘engine’ => ‘InnoDB’,
2.- Ir a tu base de datos y verificar qué tablas están con el motor MyISAM y cuales con InnoDB. Para cambiar todas las tablas que están en el motor que no es el adecuado, lo mejor es lanzar esta query:
SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME,' ENGINE=InnoDB;')
FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'nombre_esquema'
AND ENGINE = 'MyISAM' AND TABLE_TYPE = 'BASE TABLE';
donde nombre_esquema es el nombre del esquema de tu base de datos.
Con el resultado de esta query, te saldrán una serie de comandos sql, que si copias en la base de datos y los ejecutas comprobarás que te ha cambiado el motor MyISAM por el motor InnoDB en todas las tablas de tu base de datos.
3.- Entra en tu aplicación de Laravel y prueba, ahora verás que el rollback funciona correctamente y todas tus transacciones ya están funcionando de forma correcta.
Espero que este pequeño artículo os solucione el problema como me lo ha solucionado a mi, tras buscar durante un buen rato por qué demonios no estaban funcionando las transacciones en Laravel.
Hermano muchas gracias, estuve horas con este error 🙁