हर किसी के उत्तर के विपरीत, आप लेनदेन के भीतर प्रभावी रूप से लेनदेन बना सकते हैं और यह वास्तव में आसान है। आप बस SAVEPOINT स्थान बनाएं और ROLLBACK TO savepoint . का उपयोग करें लेन-देन का हिस्सा रोलबैक करने के लिए, जहां सेवपॉइंट आप जो भी नाम सेवपॉइंट देते हैं। MySQL दस्तावेज़ से लिंक करें:http://dev.mysql.com/doc/refman/5.0/hi/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
}