【问题标题】:"Lock wait timeout exceeded; try restarting transaction" on simple table简单表上的“超过锁定等待超时;尝试重新启动事务”
【发布时间】:2011-05-17 04:46:16
【问题描述】:

我已经创建了数据库表。但是有一个奇怪的事情我可以将行插入表中,但是当我想删除或更新数据库行时会抛出错误:

/* SQL 错误 (1205): 锁定等待超时 超过;尝试重启事务 */

在其他表中没有错误,一切正常。

这是一个表结构:

CREATE TABLE `cruises` (
    `id` BIGINT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `enable_text` ENUM('true','false') NOT NULL,
    `enable_file` ENUM('true','false') NOT NULL,
    `title` VARCHAR(256) NOT NULL,
    `full_text` MEDIUMTEXT NOT NULL,
    `description` VARCHAR(256) NULL,
    `date_of_departure` DATE NOT NULL,
    `number_of_nights` INT(10) UNSIGNED NOT NULL,
    `point_of_departure` VARCHAR(256) NOT NULL,
    `cruise_type` BIGINT(10) UNSIGNED NOT NULL,
    `cruises_document_id` BIGINT(10) UNSIGNED NOT NULL,
    `price` FLOAT(5,0) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_cruises_cruises_types` (`cruise_type`),
    INDEX `FK_cruises_cruises_documents` (`cruises_document_id`),
    CONSTRAINT `FK_cruises_cruises_documents` FOREIGN KEY (`cruises_document_id`) REFERENCES `cruises_documents` (`id`),
    CONSTRAINT `FK_cruises_cruises_types` FOREIGN KEY (`cruise_type`) REFERENCES `cruises_types` (`id`)
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

我已经在 2 个不同的数据库上尝试过这个东西,但同样的问题一直出现。有什么想法吗?

【问题讨论】:

  • 在两个数据库之间复制时,我遇到了相同的超时错误。重新启动复制从属服务器总是“修复它”,但它越来越烦人。

标签: mysql


【解决方案1】:

这是锁争用的问题,最终导致其中一个锁超时。以下是一些建议:

  • 确保您有正确的索引,这会导致行级锁而不是表级锁。这将减少争用。
  • 确保您在外键约束上有索引。为了检查插入或更新期间的关系约束,如果没有这样的索引,某些数据库会锁定整个引用的表(不知道是否是 MySQL 的情况)
  • 如果问题仍然存在,请尝试使事务更快/更小。同样,这将减少对数据库的争用。
  • 增加超时但保持合理的值

还要检查您是否获得了两个连接。因为这两个交易会混合,你会得到以上错误!!!

还可以查看link.. 这可能会对您有所帮助...

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2019-06-02
    • 1970-01-01
    • 2013-09-22
    • 2015-09-27
    • 2019-03-11
    • 2013-06-29
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多