在简单的表上“超过锁定等待超时;尝试重新启动事务”

时间:2010-11-29 09:56:53

标签: mysql

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

  

/ * 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个不同的数据库上试过这个东西,但是同样的问题一直出现。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

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

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

同时检查您是否获得了两个连接。因为这两个交易将变得混杂,你将得到上述错误!!!

同时检查此link ..这可能对您有所帮助......