我有一個大的生產Web應用程序(Glassfish 3.1 + MySQL 5.5)。所有的表都是InnoDB。每幾天一次應用程序完全掛起。 SHOW FULL PROCESSLIST
顯示許多簡單的插入或更新查詢在不同的表,但所有有狀態MySQL InnoDB掛在等待表級鎖
等待表級鎖
例子:
update user<br>
set user.hasnewmessages = NAME_CONST('in_flag',_binary'\0' COLLATE 'binary')
where user.id = NAME_CONST('in_uid',66381)
insert into exchanges_itempacks
set packid = NAME_CONST('in_packId',332149), type = NAME_CONST('in_type',1), itemid = NAME_CONST('in_itemId',23710872)
查詢最長的「時間」是也在等待表級鎖。 請幫忙弄清楚爲什麼MySQL試圖獲得級別鎖定以及可以鎖定所有這些表的內容。所有關於InnoDB鎖定的文章都說如果你不強迫它這樣做,這個引擎就不使用表鎖。
我my.cnf
有這樣的:
innodb_flush_log_at_trx_commit = 0
innodb_support_xa = 0
innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode=2
二進制日誌是關閉的。我根本沒有「LOCK TABLES」或其他明確的鎖定命令。交易記錄爲READ_UNCOMMITED
。
SHOW ENGINE INNODB STATUS
輸出: http://avatar-studio.ru:8080/ph/imonout.txt
爲什麼你的隔離級別設置爲「READ_UNCOMMITED」,它是一個髒模式,我絕不會建議將它設置在生產服務器上, – 2011-06-03 13:21:16
這裏可能有一些有用的信息:[InnoDB Lock Modes](http:///dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html),特別是文檔後面描述的意圖鎖定和死鎖的可能原因。最後還要注意用戶的評論。 – Mike 2011-07-12 06:58:05