模拟表锁定问题

时间:2012-11-01 03:17:15

标签: mysql locking

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

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

1 个答案:

答案 0 :(得分: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事务时,事情应该继续正常,但在此之前,行将处于锁定状态,无法访问。这听起来像是你试图复制的条件。