mysql transactions nested-transactions

¿Se permiten transacciones anidadas en MySQL?



transactions nested-transactions (3)

¿MySQL permite el uso de transacciones anidadas?


De la documentación de MySQL:

Las transacciones no se pueden anidar. Esto es una consecuencia de la confirmación implícita realizada para cualquier transacción actual cuando se emite una declaración START TRANSACTION o uno de sus sinónimos. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html


Si usas php, entonces podrías ser interesante en https://github.com/Enelar/phpsql Soporta mysql y pgsql, y se puede extender a otros conectores.

function TransferMoney() { // Nested transaction code could not even know that he nested $trans3 = db::Begin(); if (!db::Query("--Withdraw money from user", [$uid, $amount], true)) return $trans3->Rollback(); db::Query("--Deposit money to system"); return $trans3->Commit(); } $trans = db::Begin(); db::Query("--Give item to user inventory"); $trans2 = $trans->Begin(); $trans2->Query("--Try some actions and then decide to rollback"); $trans2->Rollback(); // Commit or rollback depending on money transfer result return $trans->Finish(TransferMoney());


InnoDB compatible con SAVEPOINTS .

Puedes hacer lo siguiente:

CREATE TABLE t_test (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; START TRANSACTION; INSERT INTO t_test VALUES (1); SELECT * FROM t_test; id --- 1 SAVEPOINT tran2; INSERT INTO t_test VALUES (2); SELECT * FROM t_test; id --- 1 2 ROLLBACK TO tran2; SELECT * FROM t_test; id --- 1 ROLLBACK; SELECT * FROM t_test; id ---