Qua*_*noi 73

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
---
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题,"保存点"是一件事"嵌套交易"支持是真正的问题.见[此链接](http://docs.oracle.com/cd/E17076_02/html/gsg_txn/C/nestedtxn.html) (15认同)
  • @arod:你知道你提供的链接与MySQL无关,不是吗? (10认同)
  • @arod:您能解释一下单线程上下文中的差异吗?谢谢! (2认同)
  • @Quassnoi我提供的链接是为了表明现在支持嵌套事务.现在,保存点很强大,但它们与嵌套的BEGIN,COMMIT/ROLLBACK(编程方式,命令方式)不同,尽管您似乎很确定在"单线程上下文"中它们是等效的.我打算直接解决这个问题(3年后:) ... (2认同)
  • @arod这个答案很好,唯一缺少的是“不,但是......”,如果你真的希望它完全满足问题。 (2认同)

ban*_*cer 26

来自MySQL文档:

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