嗯,基本上,我有这个脚本,它需要很长时间来执行,偶尔会超时,并在我的数据库中留下半完整的数据。(是的,我知道在一个完美的世界里,我会修复它,而不是实现提交和回滚,但我被迫不这样做)
以下是我的基本代码(为了简单起见,简化了代码):
$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循环的开头和结尾使用commits/rollbacks来做这件事,但是我不知道怎么做。
发布于 2008-11-30 23:52:14
看一看this tutorial on transactions with PDO。
基本上,将长时间运行的代码包装在:
$dbh->beginTransaction();
...
$dbh->commit();和according to this PDO document page
当脚本结束或连接即将关闭时,如果有未完成的事务,PDO将自动回滚该事务。
因此,您将丢失脚本超时时挂起的事务。
但实际上,你应该重新设计它,这样它就不会依赖于脚本的存活。
发布于 2008-11-30 23:53:50
您需要为事务使用基于InnoDB的表,然后使用任何支持它们的库,如PDO或MySQLi。
发布于 2010-12-10 18:08:52
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();
}https://stackoverflow.com/questions/329622
复制相似问题