MySQL中的NOWAIT是一種操作選項(xiàng),當(dāng)多個事務(wù)同時對同一行或同一塊數(shù)據(jù)進(jìn)行操作時,NOWAIT選項(xiàng)可以讓當(dāng)前事務(wù)不必等待其他事務(wù)完成,直接進(jìn)行自己的操作。
例如:
START TRANSACTION; SELECT * FROM table WHERE id = 1 FOR UPDATE NOWAIT; -- 如果另一個事務(wù)正在操作id=1的數(shù)據(jù),此處會立即返回錯誤 -- 如果沒有其他事務(wù),當(dāng)前事務(wù)可以成功獲取id=1的行鎖 UPDATE table SET value = 2 WHERE id = 1; COMMIT;
使用NOWAIT選項(xiàng)的事務(wù)需要在獲取鎖或訪問數(shù)據(jù)時立即失敗,而不是等待其他事務(wù)完成。
SET SESSION innodb_lock_wait_timeout = 1; START TRANSACTION; SELECT * FROM table1 WHERE id = 1 FOR UPDATE NOWAIT; -- 如果另一個事務(wù)正在操作id=1的行,此處會立即返回錯誤 -- 如果沒有其他事務(wù),當(dāng)前事務(wù)可以成功獲取id=1的行鎖 UPDATE table1 SET value = 2 WHERE id = 1; -- 假設(shè)另一個事務(wù)正在操作id=2的行,并占用行鎖,接下來我們嘗試更改它 SELECT * FROM table1 WHERE id = 2 FOR UPDATE NOWAIT; -- 即使另一個事務(wù)仍在操作id=2,這里也會返回錯誤,因?yàn)槲覀兪褂昧薔OWAIT選項(xiàng)
NOWAIT選項(xiàng)僅在InnoDB存儲引擎中可用。