日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Oracle数据库锁的种类及研究

發(fā)布時(shí)間:2024/8/26 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle数据库锁的种类及研究 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。