PHP에서 MySQL의 Commit/Rollback을 구현하려면 어떻게해야합니까?
문제
기본적으로 나는이 스크립트를 실행하는데 오랜 시간이 걸리고 때로는 시간이 걸리고 때로는 데이터베이스 주위에 반세 데이터를 떠난다. (예, 완벽한 세상에서 커밋과 롤백을 구현하는 대신 고칠 것이지만 그렇게하지 말아야합니다)
다음은 내 기본 코드입니다 (단순성을 위해 멍청한).
$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>";
}
}
?>
제휴하지 않습니다 StackOverflow