代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

MySQL中是否允许嵌套事务?

  •  77
  • Alix Axel  · 技术社区  · 15 年前

    MySQL允许使用嵌套事务吗?

    3 回复  |  直到 8 年前
        1
  •  69
  •   Quassnoi    15 年前

    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
    ---
    
        2
  •  24
  •   bancer    8 年前

    从MySQL文档:

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

        3
  •  -5
  •   Offenso    10 年前

    如果您使用PHP,那么您可能会对 https://github.com/Enelar/phpsql 它支持mysql和pgsql,并可扩展到其他连接器。

    function TransferMoney()
    { // Nested transaction code could not even know that he nested
      $trans3 = db::Begin();
      if (!db::Query("--Withdraw money from user", [$uid, $amount], true))
        return $trans3->Rollback();
      db::Query("--Deposit money to system");
      return $trans3->Commit();
    }
    
    $trans = db::Begin();
    db::Query("--Give item to user inventory");
        $trans2 = $trans->Begin();
        $trans2->Query("--Try some actions and then decide to rollback");
        $trans2->Rollback();
    // Commit or rollback depending on money transfer result
    return $trans->Finish(TransferMoney());