Я использую php / mysql. я знаю о транзакции в mysql, но не могу использовать в своем скрипте. ниже мой сценарий, как я могу использовать транзакцию php в моем коде.ie BEGIN, ROLLBACK, COMMIT
foreach($json_a['shop'] as $jsondata=>$json) { if($json['category']==='product') { $name_product=$json['name']; $query1="insert into product(id,name,user_id)values('','" . mysql_real_escape_string($name_product). "','1')"; $result1=mysql_query($query1) or die("error in query".mysql_errno()); //echo "success...!"; $product++; } else if($json['category']==='order') { $name_order=$json['name']; $query2="insert into order(id,name,user_id)values('','" . mysql_real_escape_string($name_order). "','1')"; $result2=mysql_query($query2) or die("error in query".mysql_errno()); $order++; } else if($json['category']==='sale') { $name_sale=$json['name']; $query3="insert into sale(id,name,user_id)values('','" . mysql_real_escape_string($name_sale). "','1')"; $result3=mysql_query($query3) or die("error in query".mysql_errno()); $sale++; } }
Просто выпустите mysql_query('START TRANSACTION');
и проверьте наличие ошибок в каждой из ваших вставок. Если один из них не сможет выполнить ROLLBACK немедленно, не выполняя никаких оставшихся запросов. Если все будет хорошо, и все они выдадут COMMIT.
Может быть, проще поставить их в блок try-catch, чтобы избежать использования слишком большого количества уровней вложенности с if-else.
// START TRANSACTION try{ // INSERT 1 if(failed) throw new Exception(); // INSERT 2 if(failed) throw new Exception(); // INSERT 3 if(failed) throw new Exception(); // COMMIT } catch(Exception $e){ // ROLLBACK }
Вы также можете взглянуть на расширение PDO PHP. Сделки являются частью его функций.
Один из вариантов – использование PDO. Пример:
$db = new PDO($dsn,$user,$password); $db->beginTransaction(); $db->exec("delete from mytable"); $allGood = doSomethingElse(); if ($allGood) { $db->commit(); } else { $db->rollBack(); }
или более элегантный метод:
$db = new PDO($dsn,$user,$password); $db->beginTransaction(); try{ //first execution $db->exec("delete from mytable"); //second execution $db->exec("insert into anothertable"); //if all went well $db->commit(); } catch (Exception $e) { //something broke, hit undo $db->rollBack(); }
Те же правила / синтаксис применяются здесь, как и в обычных операциях MySQL в отношении транзакций.
Вот пример:
$query0 = 'START TRANSACTION;'; mysql_query($query0) or die('woops' . mysql_error()); /* all of your queries here */ $query5 = 'COMMIT;'; mysql_query($query5) or die('woops' . mysql_error());
Более подробную информацию о синтаксисе транзакций MySQL можно найти здесь: http://dev.mysql.com/doc/refman/5.0/en/commit.html