sql >> データベース >  >> RDS >> Mysql

トランザクション内のMysqlトランザクション

    他の人の答えとは反対に、トランザクション内で効果的にトランザクションを作成することができ、それは本当に簡単です。 SAVEPOINTの場所を作成し、ROLLBACK TO savepointを使用するだけです。 トランザクションの一部をロールバックします。セーブポイント は、セーブポイントに付ける名前です。MySQLドキュメントへのリンク: http: //dev.mysql.com/doc/refman/5.0/en/savepoint.html そしてもちろん、トランザクション内のどこのクエリも、暗黙的にコミットするタイプであってはなりません。そうしないと、トランザクション全体がコミットされます。

    例:

    START TRANSACTION;
    
    # queries that don't implicitly commit
    
    SAVEPOINT savepoint1;
    
    # queries that don't implicitly commit
    
    # now you can either ROLLBACK TO savepoint1, or just ROLLBACK to reverse the entire transaction.
    
    SAVEPOINT savepoint2;
    
    # queries that don't implicitly commit
    
    # now you can ROLLBACK TO savepoint1 OR savepoint2, or ROLLBACK all the way.
    # e.g.
    
    ROLLBACK TO savepoint1;
    COMMIT; # results in committing only the part of the transaction up to savepoint1
    

    PHPで私はこのようなコードを書きました、そしてそれは完璧に機能します:

    foreach($some_data as $key => $sub_array) {
      $result = mysql_query('START TRANSACTION'); // note mysql_query is deprecated in favor of PDO
      $rollback_all = false; // set to true to undo whole transaction
      for($i=0;$i<sizeof($sub_array);$i++) {
        if($sub_array['set_save'] === true) {
          $savepoint = 'savepoint' . $i;
          $result = mysql_query("SAVEPOINT $savepoint");
        }
        $sql = 'UPDATE `my_table` SET `x` = `y` WHERE `z` < `n`'; // some query/queries
        $result = mysql_query($sql); // run the update query/queries
    
        $more_sql = 'SELECT `x` FROM `my_table`'; // get data for checking
        $result = mysql_query($more_sql);
    
        $rollback_to_save = false; // set to true to undo to last savepoint
        while($row = mysql_fetch_array($result)) {
          // run some checks on the data
          // if some check says to go back to savepoint:
          $rollback_to_save = true; // or just do the rollback here.
          // if some check says to rollback entire transaction:
          $rollback_all = true;
        }
        if($rollback_all === true) {
          mysql_query('ROLLBACK'); // rollback entire transaction
          break; // break out of for loop, into next foreach
        }
        if($rollback_to_save = true) {
          mysql_query("ROLLBACK TO $savepoint"); // undo just this part of for loop
        }
      } // end of for loop
      mysql_query('COMMIT'); // if you don't do this, the whole transaction will rollback
    }
    


    1. MySQLは複数の文字を置き換えることができますか?

    2. SQLServerのSTATISTICSXMLとは何ですか?

    3. 指定された名前と引数のタイプに一致する演算子はありません。明示的な型キャストを追加する必要があるかもしれません。 --Netbeans、Postgresql 8.4、Glassfish

    4. JDBCによるOracleの非アクティブなセッション