gpt4 book ai didi

mysql - 如何测试MySQL事务?

转载 作者:IT老高 更新时间:2023-10-29 00:11:55 25 4
gpt4 key购买 nike

我有一个关于在事务中测试查询的问题。我使用 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"); 更改为 mysql_query("ROLLBACK");,但是我可以想象这不是测试这类东西的好方法。将每个表复制到 temp_table 并更新并插入这些表并在之后删除它们通常是不可行的(例如,因为表可能非常大)。当然,当代码投入生产时,相关的错误处理(而不仅仅是打印错误)就会到位。

做这样的事情最好的方法是什么?

最佳答案

首先,您的实现中存在错误。如果查询出错,当前事务会自动回滚然后关闭。因此,当您继续执行查询时,它们将不在事务中(它们将提交给数据库)。然后,当您执行 Rollback 时,它会悄无声息地失败。来自 MySQL docs :

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 只应在您确定在应用程序中需要回滚时使用(出于查询错误以外的原因)。例如,如果您要从帐户中扣除资金,如果您发现用户没有足够的资金来完成交易,您会明确回滚...

就测试事务而言,我会复制数据库。我创建了一个新数据库并安装了一组“虚拟数据”。然后我使用自动化工具运行所有测试。该工具将实际提交事务并强制回滚,并检查在整个测试过程中是否保持了预期的数据库状态。如果您对交易有未知输入,则很难以编程方式了解交易的最终状态,因此测试实时(甚至从实时复制)数据并不容易。您可以(并且应该)这样做,但不要依赖这些结果来确定您的系统是否正常工作。使用这些结果为自动化测试人员构建新的测试用例...

关于mysql - 如何测试MySQL事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com