閱讀代碼看到select for update ,記錄一下,但還不是很明白。sql
select * from t for update 會等待行鎖釋放以後,返回查詢結果。
select * from t for update nowait 不等待行鎖釋放,提示鎖衝突,不返回結果
select * from t for update wait 5 等待5秒,若行鎖仍未釋放,則提示鎖衝突,不返回結果
select * from t for update skip locked 查詢返回查詢結果,但忽略有行鎖的記錄
SELECT...FOR UPDATE 語句的語法以下:
SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
OF 子句用於指定即將更新的列,即鎖定行上的特定列。
WAIT 子句指定等待其餘用戶釋放鎖的秒數,防止無限期的等待。
「使用FOR UPDATE WAIT」子句的優勢以下:
1防止無限期地等待被鎖定的行;
2容許應用程序中對鎖的等待時間進行更多的控制。
3對於交互式應用程序很是有用,由於這些用戶不能等待不肯定
4 若使用了skip locked,則能夠越過鎖定的行,不會報告由wait n 引起的‘資源忙’異常報告
分紅兩類:加鎖範圍子句和加鎖行爲子句
加鎖範圍子句:
在select…for update以後,可使用of子句選擇對select的特定數據表進行加鎖操做。默認狀況下,不使用of子句表示在select全部的數據表中加鎖
加鎖行爲子句:
當咱們進行for update的操做時,與普通select存在很大不一樣。通常select是不須要考慮數據是否被鎖定,最多根據多版本一致讀的特性讀取以前的版本。
加入for update以後,Oracle就要求啓動一個新事務,嘗試對數據進行加鎖。若是當前已經被加鎖,默認的行爲必然是block等待。
使用nowait子句的做用就是避免進行等待,當發現請求加鎖資源被鎖定未釋放的時候,直接報錯返回。
在平常中,咱們對for update的使用仍是比較廣泛的,特別是在如pl/sql developer中手工修改數據。此時只是以爲方便,而對for update真正的含義缺少理解。
For update是Oracle提供的手工提升鎖級別和範圍的特例語句。Oracle的鎖機制是目前各種型數據庫鎖機制中比較優秀的。
因此,Oracle認爲通常不須要用戶和應用直接進行鎖的控制和提高。甚至認爲死鎖這類鎖相關問題的出現場景,大都與手工提高鎖有關。
因此,Oracle並不推薦使用for update做爲平常開發使用。並且,在平時開發和運維中,使用了for update卻忘記提交,會引發不少鎖表故障。
那麼,何時須要使用for update?就是那些須要業務層面數據獨佔時,能夠考慮使用for update。
場景上,好比火車票訂票,在屏幕上顯示郵票,而真正進行出票時,須要從新肯定一下這個數據沒有被其餘客戶端修改。因此,在這個確認過程當中,可使用for update。這是統一的解決方案方案問題,須要前期有所準備。