oracle中的資料編輯
- for update 和 rowid
- rowid
- for update
- 1)select... for update
- 2)select ...for update nowait
- 3)select ...for update wait
- 4)skip locked
for update 和 rowid
開發反饋說操作表一直卡著,查了才發現開發用for update 操作插入資料,導致的行等待,然后借這個機會整理下oracle的這個知識點,
rowid
在ORACLE中用ROWID來定位記錄是最快的,比索引還快,所以如果先用SELECT ROWID選出要更新的行,放入COLLECTION中,再用 FORALL UPDATE 來批量更新可以提高速度,從這點來講是比其他方法好一點, 運行后并未給資料加上行級鎖(通過物理地址去確定某一行資料),但可以編輯資料,提交事務的瞬間完成上鎖、提交、解鎖等動作,不易發生鎖表,
for update
SELECT FOR UPDATE在更新前會鎖定記錄,這在復雜的并行查詢更新程式中是必要的,比如要求資料一致性,在過濾資料時不允許他人改動資料,會用FOR UPDATE或SET TRANSACTION READ ONLY來加鎖,另外像 CURSOR里的WHERE CURRENT OF CURSOR陳述句要求SELECT中必須加FOR UPDATE,當陳述句運行時,會在對應行(where子句)加上行級鎖,無where子句等于全表上鎖(即for update產生兩種鎖,行鎖和表鎖),若遇到客戶端斷網、測驗人員忘記提交\回滾事務,則會發生鎖表,
1)select… for update
select for update 當oracle發現select的當前結果集中的一潭訓多條正在被修改(注意:當資料被修改時,此時的資料行是被加鎖的),那么他就會等到當前當前結果集被修改完畢并且commit之后才進行select操作,并對結果集進行加鎖,同樣的,如果查詢陳述句發出后,其他會話需要修改結果集中的一條(或幾條資料)也許要等到查詢結束(commit)之后,才可以執行修改操作,
2)select …for update nowait
select for update nowait for update和for update nowait都會對查詢到的當前結果集進行加鎖,所不同的是,當有另外的會話在修改當前結果集中的資料,select for nowait所進行的查詢操作不會進行等待,當發現結果集中的一些資料被加鎖,立刻回傳 “ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”,
3)select …for update wait
select for update wait 它也會對查詢到的結果集進行加鎖,select for update wait與select for update nowait不同的地方是,當有另外的會話對它的查詢結果集中的某一行資料進行了加鎖,那么它不會像nowait一樣,立即回傳"ORA-00054錯誤",而是它支持一個引數,設定等待的時間,當超過了設定的時間,那一行資料還處于加鎖的狀態,那么它也會回傳“ORA-00054錯誤,內容是資源正忙, 但指定以 NOWAIT 方式獲取資源”,
4)skip locked
skip locked是oracle 11g引入的,通過skip locked可以使select for update陳述句可以查詢出(排除已經被其他會話加鎖了的資料行)剩下的資料集,并給剩下的資料集,進行加鎖操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/261445.html
標籤:其他
上一篇:mysql學習筆記之資料庫
