Разрешены ли вложенные транзакции в 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
---

20
это был не вопрос, «точки сохранения» - это единственное, на что была поставлена ​​поддержка «вложенных транзакций». См. Эту ссылку
arod 02

1
@arod: не могли бы вы объяснить разницу в однопоточном контексте? Благодарность!
Quassnoi

@Quassnoi Я считаю, что команды, передаваемые в БД, отличаются, не так ли? Я могу ошибаться
arod 03

2
@Quassnoi предоставленная мной ссылка должна была показать, что теперь поддерживаются вложенные транзакции. Точки сохранения - это мощное средство, но они не то же самое, что вложенные BEGIN, COMMIT / ROLLBACK (программно, командно), хотя вы почти уверены, что в «однопоточном контексте» они эквивалентны. Я намеревался обратиться к этому вопросу напрямую (3 года спустя :) ...
arod

12
@arod: вы знаете, что предоставленная вами ссылка не имеет ничего общего с MySQL, не так ли?
Quassnoi

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.