2008-11-30 11 views
7

Ну, в основном у меня есть этот скрипт, который занимает много времени, чтобы выполнять, а иногда и время, и оставляет полуполные данные, плавающие вокруг моей базы данных. (Да, я знаю, что в идеальном мире я бы исправить, что вместо реализации фиксаций и откатов, но я вынужден не делать)Как я могу реализовать commit/rollback для MySQL в PHP?

Вот мой основной код (упрощенным вниз для простоты):

$database = new PDO("mysql:host=host;dbname=mysql_db","username","password"); 

while (notDone()) 
{ 
    $add_row = $database->prepare("INSERT INTO table (columns) VALUES (?)"); 
    $add_row->execute(array('values')); 

    //PROCESSING STUFF THAT TAKES A LONG TIME GOES HERE 
} 

$database = null; 

Поэтому моя проблема заключается в том, что если это произойдет, если весь процесс в этом цикле while не будет завершен, я не хочу, чтобы вставленная строка оставалась там. Я думаю, что каким-то образом я мог использовать commits/rollbacks в начале и конце цикла while, но не знаю, как это сделать.

ответ

10

Взгляните на this tutorial на транзакции с PDO.

В основном обернуть давно работает код:

$dbh->beginTransaction(); 
... 
$dbh->commit(); 

И according to this PDO document page:

«Когда сценарий завершается или когда соединение собирается быть закрыто, если у вас есть выдающиеся сделки, PDO будет автоматически откатывает его обратно. "

Таким образом, вы потеряете транзакцию, ожидающую выполнения, когда время ожидания скрипта.

Но на самом деле вы должны переделать это так, чтобы это не зависело от остатка живого.

+0

Спасибо, я не пробовал еще, но я думаю, что это именно то, что я ищу – 2008-11-30 23:54:27

1

Вам необходимо использовать таблицы, основанные на InnoDB для транзакций, а затем использовать любую библиотеку, такую ​​как PDO или MySQLi, которая их поддерживает.

-1
<?php 
//This may help someone....This code commit the transactions 
//only if both queries insert and update successfully runs 

$mysqli=new mysqli("localhost","user_name","password","db_name"); 

if(mysqli_connect_errno()) 
{ 
    echo "Connection failed: ".mysqli_connect_error(); 
} 
else 
{ 
    $mysqli->autocommit(FALSE); 
    $mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')"); 
    echo $q_ins=$mysqli->affected_rows."<br>"; 
    $mysqli->query("update tblbook set book='book3' where cid='3'"); 
    echo $q_upd=$mysqli->affected_rows."<br>"; 

    if($q_ins==1 && $q_upd==1) 
    { 
     $mysqli->commit(); 
     echo "Commit<br>"; 
    } 
    else 
    { 
     $mysqli->rollback(); 
     echo "Rollback<br>"; 
    } 
} 
?> 
1
try 
{ 
    $mysqli->autocommit(FALSE); 
    $mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')"); 
    echo $q_ins=$mysqli->affected_rows."<br>"; 
    $mysqli->query("update tblbook set book='book3' where cid='3'"); 
    echo $q_upd=$mysqli->affected_rows."<br>"; 
    $mysqli->commit(); 
} 
catch(PDOException $e) 
{ 
    $mysqli->rollback(); 
    echo $sql . '<br />' . $e->getMessage(); 
}