문제

기본적으로 나는이 스크립트를 실행하는데 오랜 시간이 걸리고 때로는 시간이 걸리고 때로는 데이터베이스 주위에 반세 데이터를 떠난다. (예, 완벽한 세상에서 커밋과 롤백을 구현하는 대신 고칠 것이지만 그렇게하지 말아야합니다)

다음은 내 기본 코드입니다 (단순성을 위해 멍청한).

$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 루프의 시작과 끝에서 커밋/롤백을 사용할 수 있다고 생각하지만 방법을 모른다고 생각합니다.

도움이 되었습니까?

해결책

보세요 이 튜토리얼 PDO와의 거래에서.

기본적으로 장거리 코드를 다음에 래핑하십시오.

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

그리고 이 PDO 문서 페이지에 따르면:

"스크립트가 종료되거나 연결이 닫히면 미결제 트랜잭션이 있으면 PDO가 자동으로 롤백됩니다."

따라서 스크립트가 시간이 초과되었을 때 계류중인 거래를 잃게됩니다.

그러나 실제로, 당신은 그것이 살아있는 Scriipt에 의존하지 않도록 이것을 재 설계해야합니다.

다른 팁

트랜잭션에 InnoDB 기반 테이블을 사용한 다음 PDO와 같은 라이브러리 또는 지원하는 MySQLI를 사용해야합니다.

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();
}
<?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>";
    }
}
?>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top