2008-11-30 17 views
7

Về cơ bản, tôi có tập lệnh này mất nhiều thời gian để thực thi và đôi khi hết giờ và để lại dữ liệu bán hoàn chỉnh trên cơ sở dữ liệu của tôi. (Vâng, tôi biết trong một thế giới hoàn hảo tôi sẽ khắc phục điều đó thay vì thực hiện các cam kết và rollbacks nhưng tôi buộc phải không làm điều đó)Làm cách nào để triển khai cam kết/khôi phục cho MySQL trong PHP?

Đây là mã của tôi cơ bản (dumbed xuống vì đơn giản):

$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; 

Vì vậy, vấn đề của tôi là nếu điều đó nếu toàn bộ quá trình trong vòng lặp while đó không hoàn thành thì tôi không muốn hàng chèn vào vẫn còn đó. Tôi nghĩ rằng bằng cách nào đó tôi có thể sử dụng cam kết/rollbacks ở đầu và cuối của vòng lặp while để làm điều này nhưng không biết làm thế nào.

Trả lời

10

Hãy xem this tutorial về giao dịch với PDO.

Về cơ bản quấn mã chạy dài trong:

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

according to this PDO document page:

"Khi kịch bản kết thúc hoặc khi một kết nối được sắp bị đóng cửa, nếu bạn có một giao dịch xuất sắc, PDO sẽ tự động cuộn lại. "

Vì vậy, bạn sẽ mất giao dịch đang chờ xử lý khi tập lệnh hết thời gian chờ.

Nhưng thực sự, bạn nên thiết kế lại điều này để nó không phụ thuộc vào scriipt ở lại còn sống.

+0

Cảm ơn, tôi đã không thử nó chưa nhưng tôi nghĩ rằng đó là chính xác những gì tôi đang tìm kiếm –

1

Bạn cần sử dụng các bảng dựa trên InnoDB cho các giao dịch sau đó sử dụng bất kỳ thư viện nào như PDO hoặc MySQLi hỗ trợ chúng.

-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(); 
}