Les transactions imbriquées sont-elles autorisées dans MySQL?

89

MySQL autorise-t-il l'utilisation de transactions imbriquées?

Alix Axel
la source
5
mysql ne prend pas en charge les transactions imbriquées
hamedkh

Réponses:

78

InnoDBprend en charge SAVEPOINTS.

Vous pouvez faire ce qui suit:

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
la source
20
ce n'était pas la question, les "points de sauvegarde" sont une chose que le support des "transactions imbriquées" était la vraie question. Voir ce lien
arod
1
@arod: pourriez-vous expliquer la différence dans un contexte à un seul thread? Merci!
Quassnoi le
@Quassnoi Je crois que les commandes envoyées à la base de données diffèrent, n'est-ce pas? Je pourrais me tromper
arod
2
@Quassnoi le lien que j'ai fourni était de montrer que les transactions imbriquées sont désormais prises en charge. Maintenant, les points de sauvegarde sont puissants, mais ils ne sont pas les mêmes que BEGIN, COMMIT / ROLLBACK imbriqués (en parlant de programme, en termes de commandes) bien que vous sembliez assez sûr que dans un «contexte à un seul thread», ils sont équivalents. J'avais l'intention de répondre directement à la question (3 ans plus tard :) ...
arod
12
@arod: vous savez que le lien que vous avez fourni n'a rien à voir avec MySQL, n'est-ce pas?
Quassnoi le
38

Depuis la documentation MySQL:

Les transactions ne peuvent pas être imbriquées. Il s'agit d'une conséquence de la validation implicite effectuée pour toute transaction en cours lorsque vous émettez une instruction START TRANSACTION ou l'un de ses synonymes. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

bancer
la source