expert oracle database architecture學習筆記
阻塞(blocking)(第6章.鎖)
如果乙個會話持有某個資源的鎖,而另乙個會話在請求這個資源,就會出現阻塞(blocking)。幾乎在所有情況下,阻塞都是可以避免的。實際上,如果你真的發現會話在乙個互動式應用中被阻塞,就說明很可能同時存在著另乙個bug,即丟失更新。也就是說,你的應用邏輯有問題,這才是阻塞的根源。
資料庫中有5條常見的dml語句可能會阻塞,具體是:insert、update、delete、merge和select for update。
1、對於阻塞的select for update,解決方法很簡單,只需增加nowait子句,他就不會阻塞了,他會向你報告,這一行已經鎖定。
2、阻塞的insert
insert的阻塞不多見。最常見的情況是,你有乙個帶主鍵的表,或者表上有唯一的約束,但兩個會話試圖用同樣的值插入一行。如果這樣,其中的乙個會話就會阻塞,直到另乙個會話提交或者回滾為止:如果另乙個會話提交,則阻塞的會話會收到乙個錯誤,指出存在乙個重複值;倘若另乙個會話會滾,則阻塞的會話會成功。還有一種情況,可能多個表通過引用完整性約束相互鏈結。對子表的插入可能會阻塞,因為它所依賴的父表正在建立或刪除。
如果允許最終用生成主鍵/唯一列值,就有可能發生insert阻塞。為避免這種情況,最容易的做法是使用乙個序列來生成主鍵/唯一列值。
如果無法使用序列,可以使用手工鎖來避免這個問題,這裡的手工鎖通過內建的dbms_lock包來實現。
(這個問題挺有意思,以後再回過頭來專門研究)
3、阻塞的merge、update和delete
在乙個互動式應用中,可以從資料庫查詢某個資料,允許終端使用者處理這個資料,再把它「放回」到資料庫中。此時如果update或delete阻塞,就說明你的**中可能存在乙個丟失更新的問題(按tom的說法,這就是你**中的bug)。你試圖更新其他人正在更新的行。通過使用select for update nowait查詢可以避免這個問題,這個查詢能做到:
·驗證自從你查詢資料之後資料未被修改(防止丟失更新)
·鎖住行(防止update或delete被阻塞)
不管是悲觀鎖定還是樂觀鎖定都可以利用select for update nowaut查詢來驗證行未被修改。悲觀鎖定會在使用者有意修改資料那一刻使用這條語句。樂觀鎖定則在即將在資料庫中更新資料時使用這條語句。這樣不僅能解決應用中的阻塞問題,還可以修正資料完整性問題。
由於marge只是insert 和 update(如果在10g中採用改進的marge語法,還可以是delete),所以可以同時使用這兩種技術。
第5章 索引與演算法,第6章 鎖
索引型別 b 樹索引 全文索引 雜湊索引 b 樹索引時最為常用和最為有效的索引,b 樹索引並不能查詢乙個給定鍵值的具體行 查詢流程 查詢資料所在的頁 將頁讀入記憶體 在記憶體中查詢資料 b 樹的層數一般是2 4層,查詢鍵值只要2 4次io操作,查詢時間只需0.02 0.04秒 聚集索引 cluste...
第8章 阻塞與非阻塞I O
阻塞操作 在執行裝置操作時,若不能獲得資源,則掛起程序直到滿足可操作的條件後再進行操作。被掛起的程序進入睡眠狀態,被從排程器的執行佇列移走,直到等待條件被滿足。非阻塞操作 在不能進行裝置操作時,並不掛起,要麼放棄要麼不停地查詢,直至可以進行操作為止。喚醒程序的地方最大可能發生在中斷裡面,因為在硬體資...
悲觀鎖定與樂觀鎖定 第6章 鎖
expert oracle database architecture學習筆記 悲觀鎖定與樂觀鎖定 第6章.鎖 為了避免丟失更新,要使用某種鎖定策略,共有兩種鎖定策略 悲觀鎖定或樂觀鎖定。悲觀鎖定 pessimistic locking 使用者在螢幕上修改值之前,這個鎖定方法就要起作用。例如,使用者...