模拟表锁定问题

8
我接手了一个使用InnoDB表的MySQL数据库系统。在高负载下会出现故障。我创建了一些jmeter测试来加载系统,以期在受控环境下看到错误。然而,我没有正确地给系统施加压力,因此错误从未出现。目前的理论是,被严重锁定的表会导致回滚,使用户数据处于奇怪的状态。这很可能意味着事务结构不正确,我想找到并修复问题,但我需要先找到问题。
我认为,如果我可以在数据库中创建各种受控的“表锁定负荷”,然后在整个系统上运行模拟用户,就可以迫使发生错误或证明该理论是错误的,但我不确定如何创建此类内容。有人有什么好的想法吗?在这一点上,我甚至不确定一个初版会是什么样子,所以任何开始的建议都会有所帮助。谢谢!

到目前为止,我已经创建了一个JMeter“测试”,执行SELECT ... FOR UPDATE,然后更新可疑表中感兴趣的行。到目前为止,我尚未能够复现错误,但这是我能想到的唯一看起来合理的方法。 - Fran K.
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之前,这些行将处于锁定状态,无法访问。听起来这正是您想要复制的条件。


谢谢,Shane。听起来这可能会有用,我打算设置一下并试试看。有没有办法跟踪被锁定的内容以及锁定的时间?我一直在记录查询,希望能检测到我的错误,但似乎这本身并不足以隔离问题,并且有很多查询。 - Fran K.
那个方法很好用,似乎是找出脆弱代码的好方式,所以我接受了这个答案。我将详细阐述并尝试创建一些JMeter测试,模拟更接近实际情况的情况,其中频繁但不是持续发生锁定。谢谢! - Fran K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接