基本上我有这个脚本需要很长时间才能执行,偶尔会超时并且会在我的数据库周围留下半完整的数据.(是的,我知道在一个完美的世界中我会解决这个问题,而不是实现提交和回滚,但我不得不这样做)
这是我的基本代码(为简单而愚蠢):
$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文档页面:
"当脚本结束或连接即将关闭时,如果您有未完成的事务,PDO将自动回滚."
因此,当脚本超时时,您将丢失待处理的事务.
但实际上,你应该重新设计它,以便它不依赖于留着活着的抄写员.