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


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
---

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.