濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級別與鎖機(jī)制對比

MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級別與鎖機(jī)制對比

熱門標(biāo)簽:N個(gè)你智能電銷機(jī)器人 廣東營銷智能外呼系統(tǒng)商家 騰訊地圖標(biāo)注要費(fèi)用嗎 高德地圖標(biāo)注公司名字大全 七日殺a19.5全地圖標(biāo)注 電渠外呼系統(tǒng) 地圖標(biāo)注怎么保存 車瑪仕極限運(yùn)動(dòng)場所地圖標(biāo)注 外呼電話系統(tǒng)用卡嗎

一,事務(wù)的4個(gè)基本特征

Atomic(原子性):
事務(wù)中包含的操作被看做一個(gè)邏輯單元,這個(gè)邏輯單元中的操作要
么全部成功,要么全部失敗。

Consistency(一致性):
只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫,否則事務(wù)應(yīng)該將其回滾到最初
狀態(tài)。

Isolation(隔離性):
事務(wù)允許多個(gè)用戶對同一個(gè)數(shù)據(jù)進(jìn)行并發(fā)訪問,而不破壞數(shù)據(jù)的正
確性和完整性。同時(shí),并行事務(wù)的修改必須與其他并行事務(wù)的修改
相互獨(dú)立。

Durability(持久性):
事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須能夠得到固化。

以上屬于廢話

二,為什么需要對事務(wù)并發(fā)控制

如果不對事務(wù)進(jìn)行并發(fā)控制,我們看看數(shù)據(jù)庫并發(fā)操作是會(huì)有那些異常情形

Lost update:
兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻中途失敗退出,
導(dǎo)致對數(shù)據(jù)的兩個(gè)修改都失效了。

Dirty Reads:
一個(gè)事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)
據(jù)但沒有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮?
都被回滾。

Non-repeatable Reads:
一個(gè)事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。

Second lost updates problem:
無法重復(fù)讀取的特例。有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù),然后其
中一個(gè)對它進(jìn)行修改提交,而另一個(gè)也進(jìn)行了修改提交。這就會(huì)造成
第一次寫操作失效。

Phantom Reads:
事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查
詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是
因?yàn)樵趦纱尾樵冞^程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的。

三, 數(shù)據(jù)庫的隔離級別

為了兼顧并發(fā)效率和異??刂疲跇?biāo)準(zhǔn)SQL規(guī)范中,定義了4個(gè)事務(wù)隔
離級別,(ORACLE和SQLSERER對標(biāo)準(zhǔn)隔離級別有不同的實(shí)現(xiàn) )

Read Uncommitted:
直譯就是"讀未提交",意思就是即使一個(gè)更新語句沒有提交,但是別
的事務(wù)可以讀到這個(gè)改變.這是很不安全的.

Read Committed:
直譯就是"讀提交",意思就是語句提交以后即執(zhí)行了COMMIT以后
別的事務(wù)就能讀到這個(gè)改變.

Repeatable Read:
直譯就是"可以重復(fù)讀",這是說在同一個(gè)事務(wù)里面先后執(zhí)行同一個(gè)
查詢語句的時(shí)候,得到的結(jié)果是一樣的.

Serializable:
直譯就是"序列化",意思是說這個(gè)事務(wù)執(zhí)行的時(shí)候不允許別的事務(wù)
并發(fā)執(zhí)行.

四,隔離級別對并發(fā)的控制

下表是各隔離級別對各種異常的控制能力。
LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

(注:LU:丟失更新;DR:臟讀;NRR:非重復(fù)讀;SLU:二類丟失更新;PR:幻像讀)

順便舉一小例。

MS_SQL:

--事務(wù)一
set transaction isolation level serializable
begin tran
insert into test values('xxx')

--事務(wù)二
set transaction isolation level read committed
begin tran
select * from test

--事務(wù)三
set transaction isolation level read uncommitted
begin tran
select * from test

在查詢分析器中執(zhí)行事務(wù)一后,分別執(zhí)行事務(wù)二,和三。結(jié)果是事務(wù)二會(huì)等待,而事務(wù)三則會(huì)執(zhí)行。

ORACLE:

--事務(wù)一
set transaction isolation level serializable;
insert into test values('xxx');
select * from test;

--事務(wù)二
set transaction isolation level read committed--ORACLE默認(rèn)級別
select * from test

執(zhí)行事務(wù)一后,執(zhí)行事務(wù)二。結(jié)果是事務(wù)二只讀出原有的數(shù)據(jù),無視事務(wù)一的插入操作。

讀者是否發(fā)現(xiàn)MS_SQL和ORACLE對并發(fā)控制的處理有所不同呢?

五,鎖

下表是鎖的兼容或沖突情形。
現(xiàn)有 S U X
請求
S Y Y N
U Y N N
X N N N

現(xiàn)有 S U X
申請    
S  Y Y N
U  Y N N
X  N N N

oracle:
 


六,注意點(diǎn)
 
一般處理并發(fā)問題時(shí)的步驟:
1、開啟事務(wù)。
2、申請寫權(quán)限,也就是給對象(表或記錄)加鎖。
3、假如失敗,則結(jié)束事務(wù),過一會(huì)重試。
4、假如成功,也就是給對象加鎖成功,防止其他用戶再用同樣的方式打開。
5、進(jìn)行編輯操作。
6、寫入所進(jìn)行的編輯結(jié)果。
7、假如寫入成功,則提交事務(wù),完成操作。
8、假如寫入失敗,則回滾事務(wù),取消提交。
9、(7.8)兩步操作已釋放了鎖定的對象,恢復(fù)到操作前的狀態(tài)。
 
對多表的操作最好一起取得鎖,或則保證處理順序;個(gè)人感覺還是前者好,雖然效率低一些

七,附
查看鎖
ORACLE:

select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status
from v$locked_object l, all_objects a
where l.object_id=a.object_id;

MS_SQL:

EXEC SP_LOCK

您可能感興趣的文章:
  • ORACLE數(shù)據(jù)庫事務(wù)隔離級別介紹
  • oracle 合并查詢 事務(wù) sql函數(shù)小知識(shí)學(xué)習(xí)
  • Oracle中死事務(wù)的檢查語句
  • Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
  • ORACLE中如何找到未提交事務(wù)的SQL語句詳解

標(biāo)簽:蘇州 遼寧 長沙 大興安嶺 棗莊 來賓 贛州 玉樹

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級別與鎖機(jī)制對比》,本文關(guān)鍵詞  MSSQL,與,Oracle,數(shù)據(jù)庫,事務(wù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級別與鎖機(jī)制對比》相關(guān)的同類信息!
  • 本頁收集關(guān)于MSSQL與Oracle數(shù)據(jù)庫事務(wù)隔離級別與鎖機(jī)制對比的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    西和县| 灌阳县| 萍乡市| 青神县| 墨玉县| 龙陵县| 西充县| 南华县| 汶川县| 临桂县| 龙泉市| 汉阴县| 呼和浩特市| 盐津县| 台州市| 鄂托克旗| 民和| 武川县| 即墨市| 万山特区| 塔河县| 庄浪县| 阿鲁科尔沁旗| 洛隆县| 山西省| 阿拉善盟| 波密县| 萨迦县| 渝中区| 水富县| 牟定县| 库尔勒市| 西乌| 蒙山县| 浦城县| 化德县| 治多县| 贺州市| 宜兰县| 沭阳县| 九龙坡区|