As transações aninhadas são permitidas no MySQL?

90

O MySQL permite o uso de transações aninhadas?

Alix Axel
fonte
5
mysql não suporta transações aninhadas
hamedkh

Respostas:

78

InnoDBapoia SAVEPOINTS.

Você pode fazer o seguinte:

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
fonte
20
essa não era a questão, "pontos de salvamento" são uma coisa que o suporte a "transações aninhadas" era a verdadeira questão. Veja este link
arod
1
@arod: você poderia explicar a diferença em um contexto de thread único? Obrigado!
Quassnoi
@Quassnoi Acredito que os comandos emitidos para o banco de dados sejam diferentes, não é? Posso estar enganado
arod
2
@Quassnoi o link que forneci era para mostrar que as transações aninhadas agora são suportadas. Agora, os pontos de salvamento são poderosos, mas eles não são o mesmo que BEGIN, COMMIT / ROLLBACK aninhados (falando programaticamente, em termos de comando), embora você pareça bastante seguro de que em um "contexto de thread único" eles são equivalentes. Eu pretendia abordar a questão diretamente (3 anos depois :) ...
arod
12
@arod: você sabe que o link fornecido não tem nada a ver com o MySQL, não é?
Quassnoi
39

Da documentação do MySQL:

As transações não podem ser aninhadas. Esta é uma consequência do commit implícito executado para qualquer transação atual quando você emite uma instrução START TRANSACTION ou um de seus sinônimos. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

bancário
fonte