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

Mae*_*tro 1 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
Run Code Online (Sandbox Code Playgroud)

我在2个不同的数据库上试过这个东西,但同样的问题一直出现.有任何想法吗?

Fah*_*kar 6

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

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

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

另请查看此链接 ..这可能对您有所帮助......