小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

在Oracle中使用鎖進(jìn)行并發(fā)控制 - 編程入門網(wǎng)

 qianliemao 2010-08-20

在Oracle中使用鎖進(jìn)行并發(fā)控制

時(shí)間:2010-02-22 blog.sohu.com 冷酷到底
轉(zhuǎn)自: http://www./database/Oracle/201002/15379.htm

  現(xiàn)在主流的數(shù)據(jù)庫(kù)管理系統(tǒng)中,都支持多個(gè)事務(wù)同時(shí)執(zhí)行,這樣提高了數(shù)據(jù)庫(kù)管理系統(tǒng)的運(yùn)行效率。試想如果只允許一個(gè)事務(wù)運(yùn)行,而這個(gè)事務(wù) 又需要很長(zhǎng)的時(shí)間,那么其他的用戶必須一直等待該事務(wù)結(jié)束,效率何其低下。執(zhí)行不同的事務(wù)雖然可以提高性能,但是有可能會(huì)破壞數(shù)據(jù)的完整性,所以我們必須 在性能和數(shù)據(jù)完整性之間進(jìn)行權(quán)衡。那么什么是并發(fā)控制呢?并發(fā)控制是數(shù)據(jù)庫(kù)管理系統(tǒng)協(xié)調(diào)多個(gè)運(yùn)行事務(wù)的行為。首先了解一下,并發(fā)控制中經(jīng)常遇到的三個(gè)問 題。

臟讀

我們通過一個(gè)products表來解釋一下什么是臟讀,該products表有一列quantity(數(shù)量),現(xiàn)在的值為20。假如現(xiàn)在有兩個(gè)事務(wù) T1和T2,它們都是要更新quantity列,T1將該列值加100,T2將此列減10,但是T1執(zhí)行失敗進(jìn)行了回滾。我們很容易計(jì)算出正確的結(jié)果 20-10=10,但是如果事務(wù)按照以下方式運(yùn)行,能夠得出什么結(jié)果?

時(shí)間   事務(wù)   步驟                 存儲(chǔ)值

1      T1     讀出quantity的值         20

2      T1      quantity=20+100        120

3      T1      寫入quantity值         120

4      T2      讀出quantity(T1未提交)     120

5      T2      quantity=120-10        110

6      T1      回滾(rollback)          20

7      T2      寫入quantity值         110

以上得出了110的結(jié)果,顯然是不正確的,問題就在于T2讀取到了T1沒有提交的數(shù)據(jù),我們把這種情況就稱之為臟讀。

不可重復(fù)讀

還是事務(wù)T1和T2,它們都是要更新quantity列,T1將該列值加100,T2將此列減10,而且兩個(gè)事務(wù)都成功。我們很容易計(jì)算出正確的結(jié)果20+100-10=110,但是如果事務(wù)按照以下方式運(yùn)行,能夠得出什么結(jié)果?

時(shí)間   事務(wù)   步驟                存儲(chǔ)值

1      T1     讀出quantity的值         20

2      T2     讀出quantity的值          20

3      T1     quantity=20+100         120

4      T2     quantity=20-10          10

5      T1     寫入quantity值(更新丟失)      110

6      T2     寫入quantity值           10

得出了10的結(jié)果,仍然是不正確的。問題就在于T2的值覆蓋了T1的值,我們把這種情況稱之為不可重復(fù)讀。

幻覺讀

例如T1對(duì)一個(gè)表中的所有行修改,同時(shí)T2向該表中插入一行記錄。這時(shí)在T1中就會(huì)發(fā)生還有沒有被修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。

SQL92標(biāo)準(zhǔn)定義了四種隔離級(jí)別,以解決以上問題,四種隔離級(jí)別如下圖所示:


Oracle提供了三種隔離級(jí)別,分別是Read Committed Serializable和Read Only。Read Committed是Oracle的默認(rèn)隔離級(jí)別,可以看出這種隔離級(jí)別消除了臟讀,但是避免不了不可重復(fù)讀和幻覺讀的發(fā)生,不過一般的應(yīng)用還是可以使用 該隔離級(jí)別的。Serializable這種隔離級(jí)別可以消除以上三個(gè)問題,但是效率會(huì)降低很多。Read Only隔離級(jí)別不是SQL92標(biāo)準(zhǔn)中定義的,它不允許事務(wù)進(jìn)行更新操作,這種隔離級(jí)別也可以消除臟讀。

Oracle中在事務(wù)開始之前可以通過以下方式設(shè)置隔離級(jí)別:

set transation isolation level read committed;
set transation isolation level serialezable;
set transation isolation level read only;

也可以在單獨(dú)的會(huì)話中設(shè)置隔離級(jí)別:

alter session set isolation_level read committed;
alter session set isolation_level serialezable;
alter session set isolation_level read only;

通過剛才的介紹,我們知道了可以設(shè)置隔離級(jí)別來降低或者消除數(shù)據(jù)的不完整性,那數(shù)據(jù)庫(kù)管理系統(tǒng)是怎么做到這一點(diǎn)的呢?答案是,采用鎖。鎖可以保護(hù)數(shù)據(jù),當(dāng)一個(gè)事務(wù)修改數(shù)據(jù)時(shí),鎖會(huì)將該數(shù)據(jù)鎖定,防止這些數(shù)據(jù)在同一時(shí)刻被其它事務(wù)修改。

大多數(shù)情況下,我們可以不必自己管理鎖,Oracle會(huì)自動(dòng)創(chuàng)建并管理,但是了解鎖是如何工作的,對(duì)我們來說也是非常有必要的。下列這些情況Oracle會(huì)創(chuàng)建鎖:

當(dāng)我們運(yùn)行了create truncate alter語句時(shí),Oracle會(huì)創(chuàng)建鎖,稱之為DDL鎖。

當(dāng)我們運(yùn)行了insert update delete語句,Oracle會(huì)創(chuàng)建鎖,稱之為DML鎖。

還有一種是內(nèi)部鎖,由Oracle在內(nèi)部使用,比如管理數(shù)據(jù)文件。在這里我們不做介紹。

從級(jí)別上講,鎖還可以分為數(shù)據(jù)庫(kù)級(jí)別鎖、表級(jí)別鎖、行級(jí)別鎖和列級(jí)別鎖(Oracle不支持)。

1、數(shù)據(jù)庫(kù)級(jí)別鎖:它會(huì)鎖定數(shù)據(jù)庫(kù)以禁止任何新會(huì)話和新事務(wù)。鎖定數(shù)據(jù)庫(kù)的最主要目的是在沒有用戶干擾的情況下完成維護(hù)。在Oracle中使用以下語句鎖定數(shù)據(jù)庫(kù)為限制模式:

alter system enable restricted session;

通過下列語句取消數(shù)據(jù)庫(kù)限制模式:

alter system disable restricted session;

以下語句將鎖定數(shù)據(jù)庫(kù)為只讀模式:

startup mount;
alter database open read only;

2、表級(jí)別鎖:它會(huì)鎖定整張表,以防止其它事務(wù)對(duì)表結(jié)構(gòu)進(jìn)行修改。比如當(dāng)我們運(yùn)行一個(gè)insert語句,如果表沒有沒鎖定,其它的事務(wù)修改了一列 (將列名修改),這時(shí)我們運(yùn)行update語句就會(huì)出錯(cuò),所以當(dāng)我們運(yùn)行DML語句時(shí),Oracle會(huì)自動(dòng)將表鎖定,DML語句執(zhí)行完,會(huì)釋放表級(jí)別鎖。 我們也可以通過lock語句鎖定表。

3、行級(jí)別鎖:當(dāng)我們運(yùn)行DML語句時(shí),當(dāng)前行上就會(huì)有行級(jí)別鎖,防止其它事務(wù)對(duì)該行進(jìn)行修改。

當(dāng)我們運(yùn)行DML語句時(shí),Oracle會(huì)自動(dòng)加鎖,請(qǐng)看以下示例:

update dept set loc='北京' where deptno=40;

然后在Oracle的企業(yè)管理器中觀察Oracle自動(dòng)管理的鎖,如下圖:

從上圖中我們可以看到,我們運(yùn)行了一個(gè)update語句,產(chǎn)生了兩個(gè)鎖,都是scott用戶,SID表示會(huì)話是10,鎖類型TX表示表級(jí)別鎖,而TX表示行級(jí)別鎖,占用的模式我們后面給大家介紹。

鎖類型:TM 鎖模式:share 某個(gè)事務(wù)鎖定了一張表,允許其它事務(wù)再鎖定這張表,但不允許這個(gè)事務(wù)對(duì)這張表進(jìn)行更新。

鎖類型:TM 鎖模式:row share 某個(gè)事務(wù)鎖定了一張表,允許其它事務(wù)再鎖定這張表中的其它行。

鎖類型:TM 鎖模式:row eclusive 某個(gè)事務(wù)鎖定了一張表,允許其它事務(wù)以相同的鎖模式鎖定這張表。

鎖類型:TM 鎖模式:share row eclusive 在share模式基礎(chǔ)上,不允許其它事務(wù)鎖定這張表。

鎖類型:TM 鎖模式:eclusive  不允許其它事務(wù)再鎖定該表,也不允許其它事務(wù)更新。

鎖類型:TX 鎖模式:eclusive  該行已經(jīng)被鎖定,不允許其它事務(wù)鎖定。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多