2008-11-30 24 views
7

Temel olarak, yürütmek için uzun zaman alan ve bazen zaman aşımına uğrayan ve veritabanımın etrafında dolaşan yarı-eksiksiz veriyi bırakan bu betiğe sahibim.PHP'de MySQL için commit/rollback'i nasıl uygularım?

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

:

İşte

(basitlik için dumbed) benim temel kodu (Evet mükemmel bir dünyada ben BU yerine kaydedilmesini veya sadeleştirmek uygulanması şike yapacak biliyorum ama bunu yapamam zorundayım) Bu yüzden benim problemim, eğer bu süreçteki tüm süreç tamamlanmıyorsa, satırın orada kalmasını istemiyorum. Sanırım bir şekilde bunu yapmak için while döngüsünün başlangıcında ve sonundaki taahhütleri/geri dönüşleri kullanabiliyordum ama nasıl olduğunu bilmiyorum.

cevap

10

PDO ile yapılan işlemlerde this tutorial'a bakın.

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

Ve according to this PDO document page:

Temelde uzun koşu kodunu sarmak komut biter veya bir bağlantı üzereyken, kapalı olması zaman olağanüstü bir işlem varsa

" PDO olacak otomatik olarak geri alır. "

Böylece, komut dosyası zaman aşımına uğradığında bekleyen işlemi kaybedersiniz.

Ama gerçekten, bunu yeniden tasarlamanız gerekir ki, hayatta kalan sürüye bağlı değildir.

+0

sayesinde, henüz denemedim ama bunun benim aradığım tam olarak ne olduğunu düşünüyorum –

1

İşlemler için InnoDB tabanlı tabloları kullanmanız ve sonra bunları destekleyen PDO veya MySQLi gibi herhangi bir kütüphaneyi kullanmanız gerekir.

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