MySQL是一種流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。當(dāng)多個用戶嘗試同時訪問相同的數(shù)據(jù)行時,鎖等待可以發(fā)生。鎖等待時,MySQL將嘗試在鎖定表之前等待時間長度內(nèi)獲取鎖定。若超時,則所有等待的進(jìn)程將會被迫放棄對該數(shù)據(jù)行的操作,以便允許其他進(jìn)程能夠訪問該數(shù)據(jù)行。
mysql>show variables like "%timeout%"; +----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | connect_timeout | 10 | | deadlock_timeout_long | 50000000 | | deadlock_timeout_short | 10000 | | delayed_insert_timeout | 300 | | have_statement_timeout | YES | | innodb_flush_log_at_timeout | 1 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 600 | | lock_wait_timeout | 31536000 | | net_read_timeout | 30 | | net_write_timeout | 60 | | rpl_stop_slave_timeout | 31536000 | | slave_net_timeout | 60 | | wait_timeout | 600 | +----------------------------+----------+ 15 rows in set (0.01 sec)
上述查詢結(jié)果中展示的是MySQL的一些超時參數(shù)的默認(rèn)值。其中,wait_timeout參數(shù)會對鎖等待超時時間產(chǎn)生影響。該參數(shù)設(shè)置客戶端連接的空閑時間長度,如果該客戶端空閑時間超出了設(shè)定的值,則MySQL將自動斷開該連接。
mysql>set innodb_lock_wait_timeout=10; Query OK, 0 rows affected (0.00 sec) mysql>select * from test where id=1 for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
以上代碼展示了如何手動設(shè)置表鎖等待超時時間。在查詢時使用了for update
鎖定,若鎖等待超過設(shè)定的超時時間,則MySQL將返回錯誤信息。