- 在 Oracle 中使用一個連接。不論你想執行 5 個查詢還是 500 個查詢,都希望最多只打開一個連接。
- 確保盡可能的使用綁定變量。
- Oracle鎖定策略:
- Oracle 只在修改時才對數據加行級鎖。正常情況下不會升級到塊級鎖或表級鎖(不過兩段提交期間的一段很短的時間內除外,這是一個不常見的操作)。
-
如果只是讀數據, Oracle 絕不會對數據鎖定。不會因為簡單的讀操作在數據行上鎖定。
-
寫入器( writer )不會阻塞讀取器( reader )。換種說法:讀( read )不會被寫( write ) 阻塞。這一點幾乎與其他所有數據庫都不一樣。在其他數據庫中,讀往往會被寫阻塞。盡管聽上去這個特性似乎很不錯(一般情況下確實如此),但是,如果你沒有充分理解這個思想,而且想通過應用邏輯對應用施加完整性約束,就極有可能做得不對。
-
寫入器想寫某行數據,但另一個寫入器已經鎖定了這行數據,此時該寫入器才會被阻塞。 讀取器絕對不會阻塞寫入器。
即:讀既不會阻塞讀,也不會阻塞寫;寫不會阻塞讀,但會阻塞寫。
Oracle 的無阻塞方法有一個副作用,如果確實想保證一次最多只有一個用戶訪問一行數據,開發人員就得自己做些工作。要加入我們自己的串行化機制來確保業務邏輯的正確性,如for update語句會使讀操作也對相應的行加鎖,確保了串行訪問。
4. Oracle多版本
①、Oracle多版本特性是Oracle并發控制機制的基礎, Oracle 采用了一種多版本、讀一致( read-consistent )的并發模型。實質上講, Oracle 利用這種機制提供了以下特性:
讀一致查詢:對于一個時間點( point in time ),查詢會產生一致的結果。
非阻塞查詢:查詢不會被寫入器阻塞,但在其他數據庫中可能不是這樣。
②、由于有多版本機制,Oracle中沒有“共享讀”鎖的概念。
只要你修改數據, Oracle 就會創建撤銷( undo )條目。這些 undo 條目寫至 undo 段(撤銷段, undo segment )。如果事務失敗,需要撤銷, Oracle 就會從這個回滾段讀取 “ 之前 ” 的映像,并恢復數據。除了使用回滾段數據撤銷事務外, Oracle 還會用它撤銷讀取塊時對塊所做的修改,使之恢復到查詢開始前的時間點 。這樣就能擺脫鎖來得到一致、正確的答案,而無需你自己對任何數據鎖定。
Oracle非阻塞讀是這樣實現的: Oracle 只看數據是否改變,它并不關心數據當前是否鎖定(鎖定意味著數據已經改變)。 Oracle 只是從回滾段中取回原來的值,并繼續處理下一個數據塊。
在數據庫中,可以得到同一個信息處于不同時間點的多個版本。Oracle 能充分使用不同時間點的數據快照來提供讀一致查詢和非阻塞查詢。
5.在SQL Server和Sybase中,NULL就等于NULL,但是,在Oracle中,NULL與NULL既不相等,也不完全不相等。
6.Oracle沒有“共享讀”鎖。