Mysql transactions within transactions

前端 未结 7 1727
清酒与你
清酒与你 2020-12-04 16:33

In a PHP script working with a mysql database, I recently had the need to use a transaction at a point that happened to be inside another transaction. All my tests seem to

7条回答
  •  长情又很酷
    2020-12-04 17:15

    Contrary to everyone else's answer, you can effectively create transactions within transactions and it's really easy. You just create SAVEPOINT locations and use ROLLBACK TO savepoint to rollback part of the transaction, where savepoint is whatever name you give the savepoint. Link to MySQL documentation: http://dev.mysql.com/doc/refman/5.0/en/savepoint.html And of course, none of the queries anywhere in the transaction should be of the type that implicitly commit, or the whole transaction will be committed.

    Examples:

    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
    

    In PHP I have written code like this, and it works perfectly:

    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

提交回复
热议问题