MySQL中是不是允许嵌套事务?

Posted

技术标签:

【中文标题】MySQL中是不是允许嵌套事务?【英文标题】:Are nested transactions allowed in MySQL?MySQL中是否允许嵌套事务? 【发布时间】:2010-11-21 08:50:40 【问题描述】:

mysql 是否允许使用嵌套事务?

【问题讨论】:

mysql 不支持嵌套事务 【参考方案1】:

不,但是

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

【讨论】:

这不是问题,“保存点”是一回事,“嵌套事务”支持才是真正的问题。见this link @arod:你能解释一下单线程上下文中的区别吗?谢谢! @Quassnoi 我提供的链接是为了表明现在支持嵌套事务。现在,保存点功能强大,但它们与嵌套的 BEGIN、COMMIT/ROLLBACK 不同(从编程上讲,命令方式),尽管您似乎很确定在“单线程上下文”中它们是等价的。我打算直接解决这个问题(3年后:) ... @arod:您知道您提供的链接与 MySQL 无关,不是吗? @arod 这个答案很好,唯一缺少的是“不,但是......”,如果你真的希望它完全满足这个问题。【参考方案2】:

来自 MySQL 文档:

事务不能嵌套。这是当您发出 START TRANSACTION 语句或其同义词之一时对任何当前事务执行的隐式提交的结果。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

【讨论】:

以上是关于MySQL中是不是允许嵌套事务?的主要内容,如果未能解决你的问题,请参考以下文章

Spring嵌套事务原理

Laravel 嵌套事务 transactions

如何在 PHP 中管理嵌套的数据库事务?

sqlserver事务可以嵌套多少事务,为啥,回答对的还可以加分

事务嵌套问题总结-rollback-only异常

java 启动jdbc 事务报错 嵌套异常