2010-11-29 119 views
1

我已經創建了數據庫表。但我可以插入行插入表中一個奇怪的事情,但是當我想刪除或更新數據庫行,它拋出一個錯誤:「鎖超時超時;嘗試重啓事務」簡單表

/* SQL Error (1205): Lock wait timeout exceeded; try restarting transaction */

其他表中沒有錯誤,一切都工作得很好。

這裏有一個表結構:

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級不同的數據庫這個東西,但同樣的問題出現在所有的時間。有任何想法嗎?

+0

2個DB之間進行復制時,我收到了相同的超時錯誤。重新啓動複製從服務器總是「修復它」,但它變得煩人。 – 2011-02-06 18:52:59

回答

6

這是鎖爭用問題,最終導致其中一個鎖超時。這裏有幾點建議:

  • 確保你有正確的索引導致行級鎖不是表級鎖。這將減少爭用。
  • 確保您有外鍵約束的索引。要在插入或更新過程中檢查關係約束,如果沒有這樣的索引,某些數據庫會鎖定整個引用表(不知道這是否是MySQL的情況)
  • 如果問題仍然存在,請嘗試使事務更快/更小。再次,這將減少對數據庫的爭用。
  • 增加超時,但保持合理價值

還要檢查,如果你獲得兩個連接。由於這兩個交易會混合,你會得到以上錯誤!

還要檢查這個link ..這可能會幫助你...

相關問題