3 ответов:
InnoDBподдерживаетSAVEPOINTS.вы можете сделать следующее:
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 ---
из документации MySQL:
транзакции не могут быть вложенными. Это является следствием неявной фиксации, выполняемой для любой текущей транзакции при создании инструкции START TRANSACTION или одного из ее синонимов. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Если вы используете php, то вы могли бы быть интересны в https://github.com/Enelar/phpsql Оно поддерживает mysql и pgsql, и extendable к другим разъемам.
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());
Comments