Sind verschachtelte Transaktionen in MySQL zulässig?

87

Ermöglicht MySQL die Verwendung verschachtelter Transaktionen?

Alix Axel
quelle
4
MySQL unterstützt keine verschachtelten Transaktionen
Hamedkh

Antworten:

76

InnoDBunterstützt SAVEPOINTS.

Sie können Folgendes tun:

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
quelle
18
Dies war nicht die Frage, "Sicherungspunkte" sind eine Sache. Unterstützung für "verschachtelte Transaktionen" war die eigentliche Frage. Siehe diesen Link
arod
1
@arod: Könnten Sie bitte den Unterschied in einem Single-Thread-Kontext erklären? Vielen Dank!
Quassnoi
@Quassnoi Ich glaube, die an die DB ausgegebenen Befehle unterscheiden sich, nicht wahr? Ich könnte mich irren
Uhr
2
@Quassnoi Der Link, den ich bereitgestellt habe, sollte zeigen, dass verschachtelte Transaktionen jetzt unterstützt werden. Jetzt sind Sicherungspunkte leistungsstark, aber sie sind nicht dasselbe wie verschachteltes BEGIN, COMMIT / ROLLBACK (programmgesteuert, befehlsbezogen), obwohl Sie ziemlich sicher zu sein scheinen, dass sie in einem "Single-Threaded-Kontext" gleichwertig sind. Ich wollte die Frage direkt ansprechen (3 Jahre später :) ...
arod
12
@arod: Sie wissen, dass der von Ihnen bereitgestellte Link nichts mit MySQL zu tun hat, nicht wahr?
Quassnoi
34

Aus der MySQL-Dokumentation:

Transaktionen können nicht verschachtelt werden. Dies ist eine Folge des impliziten Commits, das für eine aktuelle Transaktion ausgeführt wird, wenn Sie eine START TRANSACTION-Anweisung oder eines ihrer Synonyme ausgeben. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

Bancer
quelle