我有一个关于测试事务中的查询的问题。我使用 MySQL 事务已经有一段时间了,每次我这样做时,我都会使用类似的东西:
$doCommit = true;
$error = "";
mysql_query("BEGIN");
/* repeat this part with the different queries in the transaction
this often involves updating of and inserting in multiple tables */
$query = "SELECT, UPDATE, INSERT, etc";
$result = mysql_query($query);
if(!$result){
$error .= mysql_error() . " in " . $query . "<BR>";
$doCommit = false;
}
/* end of repeating part */
if($doCommit){
mysql_query("COMMIT");
} else {
echo $error;
mysql_query("ROLLBACK");
}
现在,我经常想测试我的交易,所以我改变mysql_query("COMMIT");
to mysql_query("ROLLBACK");
,但我可以想象这不是测试此类内容的好方法。将每个表复制到 temp_table 并更新和插入这些表并随后删除它们通常不太可行(例如因为表可能非常大)。当然,当代码投入生产时,相关的错误处理(而不仅仅是打印错误)就会到位。
做这样的事情最好的方法是什么?
首先,你的实现中存在一个错误。如果查询出错,当前事务将自动回滚然后关闭。因此,当您继续执行查询时,它们将不会在事务内(它们将被提交到数据库)。然后,当你执行Rollback
,它会默默地失败。来自MySQL 文档 http://dev.mysql.com/doc/refman/5.0/en/commit.html:
Rolling back can be a slow operation that may occur implicitly without the user
having explicitly asked for it (for example, when an error occurs).
显式命令ROLLBACK
仅当您在应用程序中确定需要回滚(出于查询错误以外的原因)时才应使用。例如,如果您从帐户中扣除资金,如果您发现用户没有足够的资金来完成交换,您会明确回滚...
至于测试事务,我确实复制了数据库。我创建一个新数据库并安装一组“虚拟数据”。然后我使用自动化工具运行所有测试。该工具将实际提交事务并强制回滚,并检查在整个测试过程中是否维护了预期的数据库状态。由于如果事务的输入未知,则很难以编程方式了解事务的最终状态,因此测试实时(甚至从实时复制)数据并不容易。您可以(并且应该)这样做,但不要依赖这些结果来确定您的系统是否正常工作。使用这些结果为自动化测试人员构建新的测试用例......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)