PHPでMySQLのコミット/ロールバックを実装するにはどうすればよいですか?
質問
まあ基本的に、このスクリプトは実行に時間がかかり、時折タイムアウトし、データベースの周りに半完全なデータが浮遊します。 (はい、完璧な世界ではコミットとロールバックを実装する代わりにTHATを修正することを知っていますが、それを行わないことを余儀なくされています)
ここに私の基本的なコードを示します(簡単にするために略しています):
$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ループ内のプロセス全体が完了していない場合、挿入された行がそこに残らないようにすることです。どういうわけか、これを行うためにwhileループの最初と最後でコミット/ロールバックを使用できると思いますが、方法はわかりません。
解決
トランザクションに関するこのチュートリアルをご覧くださいPDOを使用。
基本的に、長期実行コードを次のようにラップします。
$dbh->beginTransaction();
...
$dbh->commit();
"スクリプトが終了するとき、または接続が閉じられるときに、未処理のトランザクションがある場合、PDOは自動的にそれをロールバックします。 "
そのため、スクリプトがタイムアウトしたときに保留されていたトランザクションが失われます。
しかし、本当に、あなたはこれを再設計する必要がありますので、それは生き続けるスクリプトに依存しません。
他のヒント
トランザクション用に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