Lo más probable es que esté complicando demasiado esto. Confío bastante en MySQL, pero nunca antes usé transacciones. Sé que el concepto es begin() , do stuff, commit() o rollback() en caso de falla y estoy bastante seguro de que puedo estructurarlo con facilidad.
Lo que quiero averiguar es que durante una transacción quiero actualizar una tabla y luego usar ese valor actualizado en otra consulta durante la misma transacción. Aquí hay un esquema:
begin() INSERT SELECT FROM INSERT UPDATE BASED ON SELECT commit()Obviamente, he reducido el código aquí y esto por sí solo no significa nada. Me gustaría saber si este concepto funciona antes de profundizar demasiado en las transacciones y descubrir que no funciona.
Mi transacción real va a ser aproximadamente 5 veces más grande y partes de ella dependen de otras partes de la transacción sin terminar como se indicó anteriormente.
Estoy usando Laravel, por lo que mi código usa DB::beginTransaction() DB::commit() y DB::rollback() si esto hace alguna diferencia en la pregunta.
Entonces, la respuesta simple a esto es sí.
Realicé varias pruebas con el código que había estado desarrollando y este es el estado, al menos en mi caso.
DB::beingTransaction()Ahora hacemos lo nuestro. TODAS LAS DECLARACIONES AQUÍ SON RELATIVAS ENTRE SI Y REALIZADAS EN ORDEN.
DB::commit()Esto luego ejecuta todas las declaraciones en orden siempre que la ejecución simulada haya sido un éxito.
DB::rollback()Esto se llama en TODOS los métodos en los que los cambios podrían fallar potencialmente dentro de un bloque try catch
Así que permítanme proporcionar un ejemplo funcional (simplificado) de Laravel para demostrar los conceptos básicos:
public function store(Request $request) { DB::beginTransaction(); try { if(!$this->setAuthorisation($request)) throw new Exception('Failed to set authorisation'); DB::commit(); return response()->json(['status' => 'OK'], 200); } catch (Exception $exception) { DB::rollBack(); return response()->json(['status' => 'Failed', 'error'=>$exception->getMessage()], 500); } } Ahora desde aquí podemos acceder a los cambios realizados en el método setAuthorisation() , digamos en un método getAuthorisation() y luego aplicar los datos de $data = getAuthorisation() a otro conjunto de código, por ejemplo, en setData($data) .
Toda la transacción funciona en el orden de los eventos simulados antes de confirmar, por lo que "aplica" los cambios antes de "realmente aplicar" los cambios. Es realmente difícil explicar más que eso, así que espero que esto responda a mi propia pregunta.