如何测试MySQL事务?

2024-01-04

我有一个关于测试事务中的查询的问题。我使用 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(使用前将#替换为@)

如何测试MySQL事务? 的相关文章

  • 我无法在剃刀视图中设置断点

    我知道可以在 MVC Razor 视图中设置断点 但出了点问题 它不再工作了 我尝试重新启动 Visual Studio 2013 并更改调试的一些选项 你有什么建议吗 感谢弗拉基米尔 我能找到解决方案 我必须清理并重建整个解决方案 我之前
  • withTransaction 和 withNewTransaction 有什么区别?

    以下动作有什么区别 def someAction User withTransaction and def someAction User withNewTransaction 我什么时候用什么 当 grails 操作仅包含 Transac
  • Mysql:计算访问频率

    我有这张桌子 CREATE OR REPLACE TABLE hits ip bigint page VARCHAR 256 agent VARCHAR 1000 date datetime 我想计算每个页面的 googlebot 访问频率
  • 当我耗尽 bigint 生成的密钥时会发生什么?怎么处理呢?

    我自己无法想象一个好的答案 所以我想在这里问 在我心里 我总是想知道 如果AUTO INCREMENT PRIMARY ID我的专栏MySQL表用完了吗 举例来说 我有一个有两列的表 一个ID auto increment primary
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat
  • 未找到教义列:1054“字段列表”中未知列“s.features”

    我在站点表中添加了一个新列 features 并使用 Doctrine 重新生成了模型 此代码导致错误 siteTable Doctrine Core getTable Site site siteTable gt findOneByNam
  • Mysql案例不工作

    SELECT SQL CALC FOUND ROWS a zn name AS zone name c name AS carrier name CASE type WHEN type 1 THEN General day ELSE Spe
  • 无法在 Eclipse 中连接到虚拟机

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 当我尝试在 Eclipse 上调试任何项目时 我突然开始遇到这个奇怪的错误 我不记得有什么改变让这个问题突然出现 Launch
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • 可以有多个用户作为 MySQL 存储过程的定义者吗?

    我在 MySQL 存储过程方面遇到了一些困难 并且感到有点沮丧 我有一组由 Bob 创建的 SP 由于他是定义者 只有他才能看到它们的 CREATE 语句 修改它们等 Mary 可以在 MySQL Workbench 的架构中看到 Bob
  • MyISAM 方言生成错误的 DDL

    我们使用 MyISAM 方言org hibernate dialect MySQLMyISAMDialect使用JPA2自动生成DDL文件3 6 9 FinalMySQL 5 5 数据库上的 hibernate 提供程序 The creat
  • Navicat utf8 不适用于 mysql 数据库

    我目前正在尝试合并两个不同步的表达式引擎数据库之间的数据更改 为此我选择使用 navicat 该网站在模板中大量使用希腊字符集 当我在 phpmyadmin 中查看希腊语表字段数据时 我按预期看到了希腊语字符 当我将它们加载到 Navica
  • 在 Eclipse 中的调试会话期间记录所有跟踪信息

    我想记录调试会话的每个步骤的所有调试信息 以便稍后处理所有这些数据 例如调用的方法的名称 参数值 所有变量值等 有没有任何选项可以实现此目的 我应该在哪里更改代码才能实现此目的 一件重要的事情 它不是一个 java 程序 这是一个使用 ac
  • ER_NOT_SUPPORTED_AUTH_MODE:客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端

    Nodejs中使用mysql的问题 const mysql require mysql var connection mysql createConnection host localhost user root password 1234
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • mysqli_stmt_bind_result 的奇怪问题

    好吧 这让我很烦恼 我似乎在 PHP 文档中找不到任何内容 在 Google resultosphere 中也找不到任何内容 所以也许有人可以在这里提供帮助 我正在使用准备好的语句 绑定结果 然后使用这些绑定结果来填充下拉列表 例子
  • PHP mysql_num_rows 死错误

    我想创建一个页面 用户可以在其中添加他们的信息 我已经创建了该页面 但我真正的问题是代码 我有一些问题 这部分代码
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra

随机推荐

  • 使用 PyDict_SetItemString 进行引用计数

    我想知道当将新值设置到 PyDict 在 C 扩展内 内的现有字段中时 内存管理 引用计数如何工作 例如 假设按以下方式创建和填充字典 myPyDict PyDict New tempPyObj PyString FromString Or
  • 读取科学计数法 scanf

    我正在开发一个程序 它应该只有一个 scanf 函数 并且应该能够接受科学计数法和实数的输入 任何帮助将不胜感激 根据scanf文档 http en cppreference com w c io fscanf f匹配浮点数 数字的格式与预
  • 通过初始化列表实例化抽象类[重复]

    这个问题在这里已经有答案了 我想了解为什么编译器允许编译以下代码 include
  • Numpy 和 matplotlib 垃圾收集

    我有一个 python 脚本 它对不同的参数进行许多模拟 Q K 绘制结果并将其存储到磁盘 每组参数 Q K 生成 200x200x80 数据点的 3D 体积网格 这需要约 100 MB 的数据 然后逐层绘制该体积网格的一部分 生成约 60
  • 将参数绑定到信号/槽

    我基本上有多个事件信号 我想将它们连接到同一个插槽 我想知道的是如何将基于字符串的参数传递到同一插槽 以便该插槽知道该信号来自哪个信号 一种替代方法是制作与信号一样多的槽 然后以 1 1 的方式连接它们 但考虑到所有处理的代码非常相似 这种
  • 在 R 中生成滞后时间序列横截面变量

    我是 R 新用户 我有一个时间序列横截面数据集 尽管我已经找到了滞后时间序列数据的方法R 我还没有找到创建滞后时间序列横截面变量的方法 以便我可以在分析中使用它们 以下是您可以如何使用lag 功能与zoo 和面板系列数据 gt librar
  • 远程主机标识已更改?

    NPM 表示可能存在安全错误 meteor npm install mui system npm ERR Error while executing npm ERR usr local bin git ls remote h t ssh e
  • 开始创建自定义视图过渡

    我正在寻找有关创建自定义视图转换的教程 特别是 涉及除受影响的 UIView 之外的元素的转换 例如在转换发生时播放动画或修改正在转换的 UIView 的屏幕截图 我并不是指实现一组基本的过渡 幻灯片 淡入淡出等 苹果网站上有很多相关示例
  • 如何以相同的方式对两个数组进行排序?

    我希望输出为 3 0 2 36 1 1 键和以相同方式排序的值 three one two fun main var l 0 var letters arrayOf one two three var digits arrayOf 2 36
  • hadoop 空指针异常

    我正在尝试设置一个hadoop的多节点集群迈克尔 诺尔的方式 http www michael noll com tutorials running hadoop on ubuntu linux multi node cluster 使用两
  • Dockerfile 中 RUN 和 CMD 的区别

    我很困惑什么时候应该使用CMD vs RUN 例如 执行 bash shell 命令 即ls la 我总是会使用CMD或者有什么情况我会使用RUN 试图了解这两个类似的最佳实践Dockerfile指令 RUN https docs dock
  • 在 IIS 6 中的应用程序级别设置 NTAuthenticationProviders

    我在 IIS 中有以下结构 Internet Information Services local computer Web Sites Default Web Site MyApplication MyApplication是 IIS 中
  • 无法在脚本模块中创建 PowerShell 别名

    重现步骤 使用以下函数和别名在 WindowsPowerShell Modules TestAlias TestAlias psm1 中创建 TestAlias 模块 function foo write output foo New Al
  • 将 defaultdict(list) 写入文件

    之前问过一个问题使用defaultdict解析多分隔符文件 https stackoverflow com questions 46264408 using defaultdict to parse multi delimiter file
  • 在 Glassfish 中导入 ssl 证书

    我有以下问题 我从 comodo 为我的 glassfish Web 应用程序获得了免费证书 90 天 然后我通过以下方式将证书导入 glassfish 3 1http javadude wordpress com 2010 04 06 g
  • 如何在不使用 UITableViewDiffableDataSource 删除和插入的情况下重新加载项目?

    我正在使用我的应用程序中实现搜索屏幕UITableViewDiffableDataSource 每个单元格代表一个搜索命中 并在单元格标题中突出显示搜索匹配 有点像 Xcode 的 快速打开 窗口突出显示其结果项的部分内容 当在搜索字段中输
  • 字符串文字中 Informix JDBC、MONEY 和小数点分隔符的问题

    我在使用 MONEY 数据类型的 JDBC 应用程序时遇到问题 当我插入 MONEY 列时 insert into money test amt values 123 45 我得到了例外 Character to numeric conve
  • 为什么不可能窃取访问令牌?

    我正在学习 OAuth 我脑子里有一个问题 我找不到答案 我理解请求令牌是否授权应用程序使用 API 但是 一旦用户获得了访问令牌 如果有人窃取了他的访问令牌 会发生什么情况 想象一下我们有类似的东西http www example com
  • 如何在不运行测试的情况下获取所有标签和黄瓜场景

    我想以某种方式获取我在项目中使用的所有标签的列表 并获取我在项目中没有运行测试的黄瓜场景的所有名称 有人可以帮助我我该怎么做吗 根据 mpkorstanje的建议 您可以为此创建一个自定义插件 public class DryRunPlug
  • 如何测试MySQL事务?

    我有一个关于测试事务中的查询的问题 我使用 MySQL 事务已经有一段时间了 每次我这样做时 我都会使用类似的东西 doCommit true error mysql query BEGIN repeat this part with th