如新文法的字面含義,nowait表示當無法擷取到鎖時直接傳回錯誤,而不是等待;skip locked表示忽略那些已經被其他session占有行鎖的記錄。
新文法的功能一目了然,不再贅述。除了這兩個新文法外,還增加了of文法指定需要加鎖的表
<a href="https://github.com/mysql/mysql-server/commit/7f958f58dea1f3477839d0945222195f20145dfb">commit id</a>
簡單看了下,這個commit包含了大量的重構,是以看起來比較長,主要在innodb層進行了擴充,加鎖選項被存儲到row_prebuilt_t::select_mode中
在加鎖時(函數 <code>lock_rec_lock_slow</code>) 會據此進行判斷,如果記錄已經加鎖, nowait直接傳回錯誤碼db_lock_nowait, skip locked的話就傳回db_skip_locked,但前者會直接傳回錯誤,後者則去繼續查詢下一條記錄(row_search_mvcc)
整體的實作思路還是滿簡單的。
alisql的文法主要包括
這個功能可以和官方的nowait/skip locked形成很好的補充。例如我們可以定義成等待多少秒後不再等待,或者直接跳過。