提问人:Andrew G. Johnson 提问时间:12/1/2008 更新时间:4/13/2012 访问量:27816
如何在PHP中实现MySQL的提交/回滚?
How can I implement commit/rollback for MySQL in PHP?
问:
好吧,基本上我有这个脚本,它需要很长时间才能执行,偶尔会超时,并使半完整的数据漂浮在我的数据库中。(是的,我知道在一个完美的世界中,我会解决这个问题,而不是实现提交和回滚,但我被迫不这样做)
这是我的基本代码(为简单起见,我做了一些简化):
$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 循环的开头和结尾使用提交/回滚来做到这一点,但不知道如何做。
答:
10赞
Brian C. Lane
12/1/2008
#1
请看一下这个关于使用 PDO 进行交易的教程。
基本上将长时间运行的代码包装在:
$dbh->beginTransaction();
...
$dbh->commit();
“当脚本结束或连接即将关闭时,如果您有未完成的事务,PDO 会自动回滚它。
因此,当脚本超时时,您将丢失待处理的事务。
但实际上,你应该重新设计它,这样它就不依赖于 scriipt 活着。
评论
0赞
Andrew G. Johnson
12/1/2008
谢谢,我还没有尝试过,但我认为这正是我想要的
1赞
Coder2000
12/1/2008
#2
您需要使用基于 InnoDB 的表进行事务处理,然后使用任何支持它们的库,例如 PDO 或 MySQLi。
-1赞
Mohit Mehta
3/9/2009
#3
<?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赞
Neelesh
12/10/2010
#4
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();
}
下一个:如何处理 MVC 网站的模板?
评论