Intereting Posts

Как использовать транзакцию в php / mysql

Я использую 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