Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các giao dịch Mysql trong các giao dịch

Trái ngược với câu trả lời của mọi người, bạn có thể tạo giao dịch trong các giao dịch một cách hiệu quả và nó thực sự dễ dàng. Bạn chỉ cần tạo các vị trí SAVEPOINT và sử dụng ROLLBACK TO savepoint để khôi phục một phần của giao dịch, trong đó savepoint là bất kỳ tên nào bạn đặt cho savepoint. Liên kết với tài liệu MySQL: http://dev.mysql.com/doc/refman/5.0/en/savepoint.html Và tất nhiên, không có truy vấn nào trong giao dịch phải thuộc loại cam kết ngầm hoặc toàn bộ giao dịch sẽ được cam kết.

Ví dụ:

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

Trong PHP, tôi đã viết mã như thế này, và nó hoạt động hoàn hảo:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để quản lý Vai trò Người dùng trong Cơ sở dữ liệu?

  2. Cách tránh phân chia theo 0 trong MySQL

  3. python và mysql trên mac os x

  4. Vấn đề so sánh ngày MySQL

  5. Làm cách nào để ánh xạ một ngày Java thành DATETIME trong mysql (theo mặc định là TIMESTAMP của nó) với các chú thích Hibernate