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