Разрешены ли вложенные транзакции в MySQL?

89

Допускает ли MySQL использование вложенных транзакций?

Аликс Аксель
источник
5
mysql не поддерживает вложенные транзакции
Хамедх

Ответы:

78

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
---
Quassnoi
источник
20
это был не вопрос, «точки сохранения» - это единственное, на что была поставлена ​​поддержка «вложенных транзакций». См. Эту ссылку
arod 02
1
@arod: не могли бы вы объяснить разницу в однопоточном контексте? Благодарность!
Quassnoi
@Quassnoi Я считаю, что команды, передаваемые в БД, отличаются, не так ли? Я могу ошибаться
arod 03
2
@Quassnoi предоставленная мной ссылка должна была показать, что теперь поддерживаются вложенные транзакции. Точки сохранения - это мощное средство, но они не то же самое, что вложенные BEGIN, COMMIT / ROLLBACK (программно, командно), хотя вы почти уверены, что в «однопоточном контексте» они эквивалентны. Я намеревался обратиться к этому вопросу напрямую (3 года спустя :) ...
arod
12
@arod: вы знаете, что предоставленная вами ссылка не имеет ничего общего с MySQL, не так ли?
Quassnoi
38

Из документации MySQL:

Транзакции не могут быть вложенными. Это следствие неявной фиксации, выполняемой для любой текущей транзакции, когда вы выполняете оператор START TRANSACTION или один из его синонимов. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

разбойник
источник