Oracle数据库锁的种类及研究
數(shù)據(jù)庫(kù)是一個(gè)多用戶(hù)使用的共享資源。當(dāng)多個(gè)用戶(hù)并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。
在數(shù)據(jù)庫(kù)中有兩種基本的鎖類(lèi)型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改;加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。
根據(jù)保護(hù)對(duì)象的不同,Oracle數(shù)據(jù)庫(kù)鎖可以分為以下幾大類(lèi):
(1) DML lock(data locks,數(shù)據(jù)鎖):用于保護(hù)數(shù)據(jù)的完整性;
(2) DDL lock(dictionary locks,字典鎖):用于保護(hù)數(shù)據(jù)庫(kù)對(duì)象的結(jié)構(gòu)(例如表、視圖、索引的結(jié)構(gòu)定義);
(3) Internal locks?和latches(內(nèi)部鎖與閂):保護(hù)內(nèi)部數(shù)據(jù)庫(kù)結(jié)構(gòu);
(4) Distributed locks(分布式鎖):用于OPS(并行服務(wù)器)中;
(5) PCM locks(并行高速緩存管理鎖):用于OPS(并行服務(wù)器)中。
在Oracle中最主要的鎖是DML(也可稱(chēng)為data locks,數(shù)據(jù)鎖)鎖。DML鎖的目的在于保證并發(fā)情況下的數(shù)據(jù)完整性。在Oracle數(shù)據(jù)庫(kù)中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱(chēng)為表級(jí)鎖,TX鎖稱(chēng)為事務(wù)鎖或行級(jí)鎖。
意向鎖的含義是如果對(duì)一個(gè)結(jié)點(diǎn)加意向鎖,則說(shuō)明該結(jié)點(diǎn)的下層結(jié)點(diǎn)正在被加鎖;對(duì)任一結(jié)點(diǎn)加鎖時(shí),必須先對(duì)它的上層結(jié)點(diǎn)加意向鎖。如:對(duì)表中的任一行加鎖時(shí),必須先對(duì)它所在的表加意向鎖,然后再對(duì)該行加鎖。這樣一來(lái),事務(wù)對(duì)表加鎖時(shí),就不再需要檢查表中每行記錄的鎖標(biāo)志位了,系統(tǒng)效率得以大大提高。
TM鎖(表級(jí)鎖)類(lèi)型共有5種,分別稱(chēng)為共享鎖(S鎖)、排它鎖(X鎖)、行級(jí)共享鎖(RS鎖)、行級(jí)排它鎖(RX鎖)、共享行級(jí)排它鎖(SRX鎖)
當(dāng)Oracle執(zhí)行DML語(yǔ)句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類(lèi)型的鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請(qǐng)TX類(lèi)型的鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。這樣在事務(wù)加鎖前檢查T(mén)X鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志,而只需檢查T(mén)M鎖模式的相容性即可,大大提高了系統(tǒng)的效率。TM鎖包括了SS、SX、S、X等多種模式,在數(shù)據(jù)庫(kù)中用0-6來(lái)表示。不同的SQL操作產(chǎn)生不同類(lèi)型的TM鎖。如表1所示。
| 表1 Oracle的TM鎖類(lèi)型 | |||
| 鎖模式 | 鎖描述 | 解釋 | SQL操作 |
| 0 | none | ? | ? |
| 1 | NULL | 空 | Select |
| 2 | SS(Row-S) | 行級(jí)共享鎖,其他對(duì)象只能查詢(xún)這些數(shù)據(jù)行 | Select for update、Lock for update、Lock row share |
| 3 | SX(Row-X) | 行級(jí)排它鎖,在提交前不允許做DML操作 | Insert、Update、Delete、Lock row share |
| 4 | S(Share) | 共享鎖 | Create index、Lock share |
| 5 | SSX(S/Row-X) | 共享行級(jí)排它鎖 | Lock share row exclusive |
| 6 | X(Exclusive) | 排它鎖 | Alter table、Drop able、Drop index、Truncate table?、Lock exclusive |
1.?共享鎖(Share Table Lock,S):
加鎖語(yǔ)法:Lock Table TableName In Share Mode;
允許的操作:一個(gè)共享鎖由一個(gè)事務(wù)控制,僅允許其它事務(wù)查詢(xún)被鎖定的表。一個(gè)有效的共享鎖明確地用Select?…?For update形式鎖定行,或執(zhí)行Lock Table TableName In Share Mode語(yǔ)法鎖定整個(gè)表,不允許被其它事務(wù)更新。
禁止的操作:一個(gè)共享鎖由一個(gè)事務(wù)來(lái)控制,防止其它事務(wù)更新該表或執(zhí)行下面的語(yǔ)句:
LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
2.?排它鎖(Exclusive Table Lock,X):
排它鎖是在鎖機(jī)制中限制最多的一種鎖類(lèi)型,允許加排它鎖的事務(wù)獨(dú)自控制對(duì)表的寫(xiě)權(quán)限。
加鎖語(yǔ)法:Lock Table TableName In Exclusive Mode;
允許的操作:在一個(gè)表中只能有一個(gè)事務(wù)對(duì)該表實(shí)行排它鎖,排它鎖僅允許其它的事務(wù)查詢(xún)?cè)摫怼?/p>
禁止的操作:擁有排外鎖的事務(wù)禁止其它事務(wù)執(zhí)行其它任何DML類(lèi)型的語(yǔ)句或在該表上加任何其它類(lèi)型的鎖。
定義排它鎖的語(yǔ)法:
LOCK TABLE TableName IN EXCLUSIVE MODE;
3.?行級(jí)鎖(Row Share Table Lock,RS):
一個(gè)行級(jí)鎖(有時(shí)稱(chēng)為Subshare Table Lock,簡(jiǎn)稱(chēng)SS,子共享鎖)需要該事務(wù)在被鎖定行的表上用update的形式加鎖。當(dāng)有下面語(yǔ)句被執(zhí)行的時(shí)候行級(jí)鎖自動(dòng)加在操作的表上。
SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;
LOCK TABLE TableName IN ROW SHARE MODE;
行級(jí)鎖(Row Share Table Lock)在鎖類(lèi)型中是限制最少的,也是在表的并發(fā)程度中使用程度最高的。
允許的操作:行級(jí)共享鎖由一個(gè)事務(wù)控制,允許其它事務(wù)查詢(xún)、插入、更新、刪除或同時(shí)在同一張表上鎖定行。因此其它事務(wù)可以同時(shí)在同一張表上得到行級(jí)鎖、共享行級(jí)排它鎖、行級(jí)排它鎖、排它鎖。
禁止的操作:擁有行級(jí)鎖的事務(wù)不允許其它事務(wù)執(zhí)行排它鎖,即:
Lock Table TableName In Exclusive Mode;
4.?行級(jí)排它鎖(Row Exclusive Table Lock,RX):
行級(jí)排它鎖(亦稱(chēng)為Subexclusive Table Lock,簡(jiǎn)稱(chēng)SX,子排它鎖)通常需要事務(wù)擁有的鎖在表上被更新一行或多行。當(dāng)有下面語(yǔ)句被執(zhí)行的時(shí)候行級(jí)排它鎖被加在操作的表上。
INSERT INTO TableName. . . ;
UPDATE TableName. . . ;
DELETE FROM TableName. . . ;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
行級(jí)排它鎖比行級(jí)鎖稍微多一些限制。
允許的操作:行級(jí)排它鎖由一個(gè)事務(wù)擁有允許其它事務(wù)執(zhí)行查詢(xún)、修改、插入、刪除或同時(shí)在同一張表上鎖定行。執(zhí)有行級(jí)排它鎖的事務(wù)允許其它事務(wù)在同一張表上同時(shí)得到共享鎖和行級(jí)排它鎖。
禁止的操作:行級(jí)排它鎖由一個(gè)事務(wù)擁有防止其它事務(wù)手動(dòng)鎖定表來(lái)排除其它事務(wù)的讀寫(xiě)權(quán)。因此,其它事務(wù)不允許在同一張表上使用以下的語(yǔ)句來(lái)執(zhí)行鎖事務(wù)。
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE
5.?共享行級(jí)排它鎖(Share Row Exclusive Table Lock,SRX):
共享行級(jí)排它鎖有時(shí)也稱(chēng)共享子排它鎖(Share Subexclusive Table Lock,SSX),它比共享鎖有更多限制。定義共享行級(jí)排它鎖的語(yǔ)法為:
Lock Table TableName In Share Row Exclusive Mode;
允許的操作:僅允許一個(gè)事務(wù)在某一時(shí)刻得到行級(jí)排它鎖。擁有行級(jí)排它鎖事務(wù)允許其它事務(wù)在被鎖定的表上執(zhí)行查詢(xún)或使用Select?…?From TableName For update…來(lái)準(zhǔn)確在鎖定行而不能更新行。
禁止的操作:擁有行級(jí)排它鎖的事務(wù)不允許其它事務(wù)有除共享鎖外的其它形式的鎖加在同一張表上或更新該表。即下面的語(yǔ)句是不被允許的:
LOCK TABLE TableName IN SHARE MODE;
LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN EXCLUSIVE MODE;
當(dāng)Oracle數(shù)據(jù)庫(kù)發(fā)生TX鎖等待時(shí),如果不及時(shí)處理常常會(huì)引起Oracle數(shù)據(jù)庫(kù)掛起,或?qū)е滤梨i的發(fā)生,產(chǎn)生ORA-60的錯(cuò)誤。
TX鎖等待的分析
Oracle數(shù)據(jù)庫(kù)中一般使用行級(jí)鎖。
當(dāng)Oracle檢測(cè)到死鎖產(chǎn)生時(shí),中斷并回滾死鎖相關(guān)語(yǔ)句的執(zhí)行,報(bào)ORA-00060的錯(cuò)誤并記錄在數(shù)據(jù)庫(kù)的日志文件alertSID.log中。同時(shí)在user_dump_dest下產(chǎn)生了一個(gè)跟蹤文件,詳細(xì)描述死鎖的相關(guān)信息。
在日常工作中,如果發(fā)現(xiàn)在日志文件中記錄了ora-00060的錯(cuò)誤信息,則表明產(chǎn)生了死鎖。這時(shí)需要找到對(duì)應(yīng)的跟蹤文件,根據(jù)跟蹤文件的信息定位產(chǎn)生的原因。
| 表2?數(shù)據(jù)字典視圖說(shuō)明 | ||
| 視圖名 | 描述 | 主要字段說(shuō)明 |
| v$session | 查詢(xún)會(huì)話的信息和鎖的信息。 | sid,serial#:表示會(huì)話信息。 program:表示會(huì)話的應(yīng)用程序信息。 row_wait_obj#:表示等待的對(duì)象,和dba_objects中的object_id相對(duì)應(yīng)。 |
| v$session_wait | 查詢(xún)等待的會(huì)話信息。 | sid:表示持有鎖的會(huì)話信息。 Seconds_in_wait:表示等待持續(xù)的時(shí)間信息 Event:表示會(huì)話等待的事件。 |
| v$lock | 列出系統(tǒng)中的所有的鎖。 | Sid:表示持有鎖的會(huì)話信息。 Type:表示鎖的類(lèi)型。值包括TM和TX等。 ID1:表示鎖的對(duì)象標(biāo)識(shí)。 lmode,request:表示會(huì)話等待的鎖模式的信 息。用數(shù)字0-6表示,和表1相對(duì)應(yīng)。 |
| dba_locks | 對(duì)v$lock的格式化視圖。 | Session_id:和v$lock中的Sid對(duì)應(yīng)。 Lock_type:和v$lock中的type對(duì)應(yīng)。 Lock_ID1:?和v$lock中的ID1對(duì)應(yīng)。 Mode_held,mode_requested:和v$lock中 的lmode,request相對(duì)應(yīng)。 |
| v$locked_object | 只包含DML的鎖信息,包括回滾段和會(huì)話信息。 | Xidusn,xidslot,xidsqn:表示回滾段信息。和 v$transaction相關(guān)聯(lián)。 Object_id:表示被鎖對(duì)象標(biāo)識(shí)。 Session_id:表示持有鎖的會(huì)話信息。 Locked_mode:表示會(huì)話等待的鎖模式的信 息,和v$lock中的lmode一致。 |
解鎖及Kill Session:
使用下面的語(yǔ)法查出鎖并殺掉Session。
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
總結(jié)
以上是生活随笔為你收集整理的Oracle数据库锁的种类及研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle冷备份/恢复
- 下一篇: linux cmake编译源码,linu