Oracle 10g 讀書筆記之鎖 |
發(fā)布時(shí)間: 2012/8/29 17:11:18 |
鎖機(jī)制用于管理對共享資源的并發(fā)訪問。 在 Oracle 中,事務(wù)應(yīng)該延遲到適當(dāng)?shù)臅r(shí)刻提交,因?yàn)槭聞?wù)很長或很大,一般不會(huì)對系統(tǒng)有壓力;行級鎖沒有相關(guān)的開銷,1個(gè)行鎖還是1000000個(gè)行鎖專用于鎖定這個(gè)信息的“資源”數(shù)都是一樣的; 不要以為鎖升級“對系統(tǒng)更好”(例如使用表鎖而不是行鎖),Oracle 中鎖升級對系統(tǒng)沒有任何好處,不會(huì)節(jié)省任何資源;可以同時(shí)得到并發(fā)性和一致性,數(shù)據(jù)讀取器不會(huì)被寫入器阻塞。 使用 ORA_ROWSCN 的樂觀鎖定: ORA_ROWSCN 建立在內(nèi)部 Oracle 系統(tǒng)時(shí)鐘(SCN)基礎(chǔ)上。在 oracle 中,每次提交時(shí),SCN 都會(huì)推進(jìn)。除非創(chuàng)建表時(shí)支持在行級維護(hù) ORA_ROWSCN ,否則 oracle 會(huì)在塊級維護(hù)。 創(chuàng)建表時(shí)啟用 ROWDEPENDENCIES,也可以使用 DBMS_REDEFINITION 中的在線重建功能。 查詢語句:select id, dbms_rowid.rowid_block_number(rowid) blockno, ora_rowscn from table 執(zhí)行 INSERT、UPDATE、DELETE、MERGE 和 SELECT FOR UPDATE 時(shí)會(huì)阻塞,最后一個(gè)增加 NOWAIT 就不會(huì)阻塞。 Oracle 從來不會(huì)鎖升級,但它會(huì)執(zhí)行鎖轉(zhuǎn)換或鎖提升。主要有三類鎖: 1、DML 鎖:用于確保一次只有一個(gè)人能修改某一行,而且你正在處理一個(gè)表時(shí)別人不能刪除這個(gè)表。 a、TX鎖(事務(wù)鎖):事務(wù)發(fā)起第一個(gè)修改時(shí)會(huì)得到TX鎖,而且會(huì)一直持有這個(gè)鎖,直至事務(wù)執(zhí)行提交或回滾。 oralce 并沒有一個(gè)傳統(tǒng)的鎖管理器,不會(huì)用鎖管理器為系統(tǒng)中鎖定的每一行維護(hù)一個(gè)長長的列表。它只是簡單找到想鎖定的那一行并鎖定它。 在待鎖定的行所在的數(shù)據(jù)塊的最前面有一個(gè)“開銷”空間,這里會(huì)存放該塊的一個(gè)事務(wù)表,大小由創(chuàng)建對象時(shí) CREATE 語句的兩個(gè)參數(shù)決定: INITTRANS:初始的預(yù)分配大小,對于索引和表,默認(rèn)為2。在頻繁修改的表上增加該值,同時(shí) PCTFREE 值也需要相應(yīng)的增加。 MAXTRANS:可以擴(kuò)展到的最大值,默認(rèn)為 255,即該塊最大的并發(fā)事務(wù)數(shù)。Oracle 10g 該參數(shù)已經(jīng)不再使用。 b、TM 鎖:用于確保在修改表的內(nèi)容時(shí),表的結(jié)構(gòu)不會(huì)改變。 每個(gè)事務(wù)只能得到一個(gè) TX 鎖,但修改多少個(gè)對象,就能得到多少個(gè) TM 鎖。并且鎖的總數(shù)可以通過 DML_LOCKS 參數(shù)定義。 如果參數(shù)設(shè)置為 0,則不允許 DDL。通過 ALTER TABLE TABLENAME DISABLE TABLE LOCK 命令,逐個(gè)禁用 TM 鎖。 2、DDL 鎖:在 DDL 操作中會(huì)自動(dòng)為對象加 DDL 鎖,從而保護(hù)這些對象不會(huì)被其他會(huì)話所修改。 a、排他鎖:防止其它會(huì)話得到它們自己的 DDL 鎖或 TM 鎖。這說明 DDL 操作期間可以查詢表,但無法修改。 大多數(shù) DDL 都帶有一個(gè)排他 DDL 鎖。例如 alter table t add new_column date; 例外:create index t_idx on t(x) online,它只會(huì)試圖得到表上的一個(gè)低級(mode 2)TM鎖,所以在 DDL 語句執(zhí)行期間對表所做的修改維護(hù)一個(gè)記錄,執(zhí)行 CREATE 時(shí)再把這些修改應(yīng)用至新的索引。 b、共享鎖:保護(hù)所引用對象的結(jié)構(gòu),使之不會(huì)其他會(huì)話修改,但是允許修改數(shù)據(jù)。在創(chuàng)建存儲(chǔ)的編譯對象(如過程或視圖)時(shí),會(huì)對依賴的對象加這種共享 DDL 鎖。 c、可中斷解析鎖:允許一個(gè)對象向另外某個(gè)對象注冊其依賴性。當(dāng)某會(huì)話解析一條語句時(shí),對該語句引用的每一個(gè)對象都會(huì)加一個(gè)解析鎖。目的是如果引用對象被修改,則將緩存的語句置為無效。 利用視圖 DBA_DLL_LOCKS 查看該信息。視圖腳本:[Oracle_HOME]/RDBMS/ADMIN\/catblock.sql 3、內(nèi)部鎖和閂:閂是輕量級的串行化設(shè)備,用于協(xié)調(diào)對共享數(shù)據(jù)結(jié)構(gòu)、對象和文件的多用戶訪問。設(shè)計(jì)為只保持極短的一段時(shí)間。使用諸如“測試和設(shè)置”以及“比較及交換”之類的原子指令來處理閂。 由于設(shè)置和釋放閂的指令是原子性的,盡管可能有多個(gè)進(jìn)程在同時(shí)請求它,但操作系統(tǒng)本身可以保證只有一個(gè)進(jìn)程能測試和設(shè)置閂。 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |