with transaction query log inner collection transactions laravel-5 eloquent

transactions - transaction - Transacción con Eloquent Laravel 5



select eloquent laravel 5 (2)

La pregunta es bastante antigua, pero en mi opinión no hay forma de lograr transacciones con el motor de almacenamiento MyISAM.

La versión más reciente del servidor MySQL es 5.7 y la guía de referencia correspondiente describe que el motor de almacenamiento MyISAM no admite transacciones.

https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

Si sé correctamente, las declaraciones de inicio, compromiso y retrotracción se aceptan sin errores, pero el comportamiento es diferente de lo esperado.

Estoy usando MyISAM para MySQL y quiero usar transacción aquí está mi código:

DB::transaction(function () { $project = Project::find($id); $project->users()->detach(); $project->delete(); });

Este código se ejecuta con éxito, pero no estoy seguro de que la transacción funcione ... ¿Cómo puedo probarlo?


En realidad, solo hay dos formas de hacerlo, ninguna de las dos es particularmente agradable, porque DB: transaction no informa errores.

  1. Ponga un bloque try / catch dentro del cierre y establezca una variable externa en el bloque catch si la transacción falla.

  2. Realice una transacción manual, utilizando DB :: beginTransaction y rollback / commit, de nuevo con un manejador de excepciones, según este ejemplo:

DB::beginTransaction(); try { $project = Project::find($id); $project->users()->detach(); $project->delete(); DB::commit(); $success = true; } catch (/Exception $e) { $success = false; DB::rollback(); } if ($success) { // the transaction worked ... }