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