rae*_*kid 13 mysql debugging transactions
我有一个关于在事务中测试查询的问题.我一直在使用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");
}
Run Code Online (Sandbox Code Playgroud)
现在,我经常想要测试我的事务,所以我mysql_query("COMMIT");改为mysql_query("ROLLBACK");,但我可以想象这不是测试这种东西的好方法.将每个表复制到temp_table并更新并插入到这些表中并在之后删除它们(例如因为表可能非常大)通常是不可行的.当然,当代码投入生产时,相关的错误处理(而不仅仅是打印错误)就会到位.
做这样的事情最好的方法是什么?
irc*_*ell 10
首先,您的实施中存在一个错误.如果查询出错,则当前事务将自动回滚然后关闭.因此,当您继续执行查询时,它们将不在事务中(它们将被提交到数据库).然后,当你执行时Rollback,它会默默地失败.来自MySQL文档:
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).
Run Code Online (Sandbox Code Playgroud)
ROLLBACK只有在应用程序中确定需要回滚时才会使用显式命令(出于查询错误以外的原因).例如,如果您从帐户中扣除资金,如果您发现用户没有足够的资金来完成交换,您就会明确回滚...
至于测试事务,我会复制数据库.我创建了一个新数据库并安装了一组"虚拟数据".然后我使用自动化工具运行所有测试.该工具实际上将提交事务并强制回滚,并检查在整个测试期间是否维护了预期的数据库状态.如果你有一个未知的事务输入,那么以编程方式从事务中知道结束状态就更难了,测试实时(甚至是从现场复制)数据并不容易.您可以(并且应该)执行此操作,但不依赖于这些结果来确定您的系统是否正常工作.使用这些结果为自动化测试程序构建新的测试用例...