有意在MySQL中创建超时和死锁错误

时间:2017-03-19 19:48:55

标签: mysql timeout mysql-workbench database-deadlocks

我目前正在使用一些数据库,我正在尝试为它们手动创建错误,以便我可以去修复它们。我不确定我是否会在修复错误方面遇到任何问题,但我不确定如何在第一时间创建错误。

我使用的是MySQL Workbench而不是终端,而我正在尝试创建一个场景,我会遇到超时错误和死锁错误。

我知道如果我在终端中发出超时错误,我会登录两次以创建两个实例,然后在两个人下对同一个数据库进行修改并尝试提交。

你已经可以用MySQL Workbench做很多了我想知道是否有任何可行的方法让我只使用工作台中的代码来复制这个动作,而不是经常打开我的终端的两个实例的麻烦。

1 个答案:

答案 0 :(得分:1)

只有一个与MySQL打开的连接就无法生成锁定超时或死锁。

但是你可以在MySQL Workbench中打开两次相同的连接配置文件。您可以打开两个(或更多)选项卡,每个选项卡都有自己的连接。然后,您可以在每个选项卡中启动事务,并尝试锁定超时和死锁。

我通过创建表test.emp1来证明这一点:

CREATE TABLE `emp1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `emp1` SET `name`='me', `date`=CURRENT_DATE();
INSERT INTO `emp1` SET `name`='you', `date`=CURRENT_DATE();

然后我在Workbench中为我的本地MySQL实例打开了两个标签。

在标签一中,我跑了:

begin;
update emp1 set name='me2' where id=1;
select sleep(10);
update emp1 set name='you2' where id=2;

在第二个标签中,我跑了:

begin;
update emp1 set name='you2' where id=2;
select sleep(10);
update emp1 set name='me2' where id=1;

单击第一个选项卡中的execute,然后在sleep(10)完成之前,单击第二个选项卡中的execute。

enter image description here

瞧!第二个选项卡上的死锁。第一个选项卡上的事务成功。

就个人而言,我觉得使用终端窗口做这件事更好,因为我可以并排排列,而不是一次只能在标签中查看。