8

我继承了一个使用 InnoDB 表构建在 MySQL 数据库上的系统。该系统有一个在重负载下出现的错误。我创建了一些 jmeter 测试来加载系统,希望在受控环境中看到错误。但是,我没有正确强调系统,并且该错误从未出现。当前的理论是,严重锁定的表会导致回滚,从而使用户的数据处于奇怪状态。这可能意味着交易结构不正确,我想找到并修复它,但我需要先找到问题。

我推测如果我可以在数据库中创建各种受控的“表锁定负载”,我就可以在整个系统上运行我的模拟用户并强制错误发生或证明理论错误,但我不确定如何创建这样的一个东西。有谁知道如何最好地做到这一点?在这一点上,我什至不确定糟糕的第一个版本会是什么样子,所以任何让我入门的想法都会有所帮助。谢谢!

4

1 回答 1

5

如果您正在专门为表中的一行寻找锁定状态(我假设这就是您的意思,除非您正在对表本身进行动态更改)。您可以通过让第二个脚本在一组行上启动事务,然后在回滚或提交事务之前暂停一段时间来实现这一点。

假设您有这个表结构,例如:

CREATE TABLE `allkindsofvalues` (
  `value1` int(11) NOT NULL,
  `value2` int(11) NOT NULL,
  `irrelevant_value3` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

打开 MySQL 提示并启动事务:

BEGIN;

UPDATE allkindsofvalues SET irrelevant_value3 = '32143234232';

现在启动您的应用程序。此时,任何使用这些行的尝试都将等待启动的事务完成。

在 MySQL 提示符中 COMMIT 或 ROLLBACK 事务的那一刻,事情应该继续正常,但在那之前,行将处于锁定状态,无法访问。这听起来像是你试图复制的条件。

于 2012-11-03T05:00:11.443 回答