程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> MSSQL與Oracle數據庫事務隔離級別與鎖機制對比,mssqloracle

MSSQL與Oracle數據庫事務隔離級別與鎖機制對比,mssqloracle

編輯:Oracle教程

MSSQL與Oracle數據庫事務隔離級別與鎖機制對比,mssqloracle


一,事務的4個基本特征

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

Consistency(一致性):
只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初
狀態。

Isolation(隔離性):
事務允許多個用戶對同一個數據進行並發訪問,而不破壞數據的正
確性和完整性。同時,並行事務的修改必須與其他並行事務的修改
相互獨立。

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

以上屬於廢話

二,為什麼需要對事務並發控制

如果不對事務進行並發控制,我們看看數據庫並發操作是會有那些異常情形

Lost update:
兩個事務都同時更新一行數據,但是第二個事務卻中途失敗退出,
導致對數據的兩個修改都失效了。

Dirty Reads:
一個事務開始讀取了某行數據,但是另外一個事務已經更新了此數
據但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作
都被回滾。

Non-repeatable Reads:
一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。

Second lost updates problem:
無法重復讀取的特例。有兩個並發事務同時讀取同一行數據,然後其
中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成
第一次寫操作失效。

Phantom Reads:
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查
詢中未出現的數據(這裡並不要求兩次查詢的SQL語句相同)。這是
因為在兩次查詢過程中有另外一個事務插入數據造成的。

三, 數據庫的隔離級別

為了兼顧並發效率和異常控制,在標准SQL規范中,定義了4個事務隔
離級別,(ORACLE和SQLSERER對標准隔離級別有不同的實現 )

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

Read Committed:
直譯就是"讀提交",意思就是語句提交以後即執行了COMMIT以後
別的事務就能讀到這個改變.

Repeatable Read:
直譯就是"可以重復讀",這是說在同一個事務裡面先後執行同一個
查詢語句的時候,得到的結果是一樣的.

Serializable:
直譯就是"序列化",意思是說這個事務執行的時候不允許別的事務
並發執行.

四,隔離級別對並發的控制

下表是各隔離級別對各種異常的控制能力。
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:非重復讀;SLU:二類丟失更新;PR:幻像讀)

順便舉一小例。

MS_SQL:

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

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

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

在查詢分析器中執行事務一後,分別執行事務二,和三。結果是事務二會等待,而事務三則會執行。

ORACLE:

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

--事務二
set transaction isolation level read committed--ORACLE默認級別
select * from test

執行事務一後,執行事務二。結果是事務二只讀出原有的數據,無視事務一的插入操作。

讀者是否發現MS_SQL和ORACLE對並發控制的處理有所不同呢?

五,鎖

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

現有 S U X
申請    
S  Y Y N
U  Y N N
X  N N N

oracle:
 


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

七,附
查看鎖
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怎測試事務隔離級別

oracle只支持2種事務隔離級別。
read commited
Serializable

alter session set isolation_level={ SERIALIZABLE | READ COMMITTED }

想測這個可以去使用mysql,它支持完整的四種事務隔離級別。
 

Oracle數據庫與Sql server數據庫各有什優缺點

2. Oracle真正實現了行級鎖,SQLServer也宣稱實現了行級鎖,但你實際去試,如果不加索引,其實是不行的。3. Oracle因為有多版本數據的技術,讀寫操作不會相互等待,雖然SQLServer 2005學習Oracle增加了snapshot機制,從而也引進了多版本數據(MySQL也有多版本數據機制,不能說一定是學習Oracle),但是實際效果感覺就是2個版本的數據,隔離級別為read committed時候,讀寫不再相互等待,但是把隔離設置為Serializable還是會產生讀寫相互等待。4. Oracle的事務日志歸檔相當方便,而SQLServer要用事務日志備份來實現,而且還要配置自動作業,啟動agent服務。5. Oracle的數據字典豐富,使得DBA容易判斷數據庫的各種情況,雖然SQLServer 2005學習了Oracle的數據字典的特點,但從數量及方便程度上還是相差太多。個人感覺這是Oracle最人性化的地方。6. Oracle的PL/SQL比SQLServer的T-SQL功能強大很多。7. Oracle的觸發器比SQLServer的種類多幾種。8. oracle的備份恢復原理相當簡單明了,備份就在操作系統上拷貝數據文件好了,恢復呢,再拷貝回來,數據是舊的,不怕,應用重做日志好了。SQLServer呢,雖然原理在本質上還是這些,但操作起來麻煩多了,麻煩到讓你體會不到其本質。9. Oracle數據庫啟動可以有多個階段,使得DBA可以在不同的情況下,通過啟動到特定的階段解決一些特殊問題,而SQLServer只要服務一啟動,所有數據庫就都打開了。10.SQLServer給人的感覺是簡單易用,但是我要說,如果你繼續向前走,就會發現SQLServer的體系結構相當復雜(注意我這裡是說的復雜),大體還是沿襲的Sybase的體系結構,這種復雜結構,估計很難有根本性的改變,而Oracle呢,時間越長你越會覺得其體系結構嚴謹,雖然開始會感覺很難。我的一個比喻,SQLServer是傻瓜相機(就是那些一兩千的小數碼),Oracle是單反相機(40D,5D,D300),如果你是入門者,那用傻瓜相機好了,在各種環境下拍攝,基本都過得去,用單反,光圈、快門都要自己設定,反倒不如傻瓜相機的效果,如果你是高手了,那傻瓜相機就很難得心應手了。11.Oracle的書籍一般都比較深,隨便一說就是一大批,EpertOracle、PracticalOracle8i、Cost-basedOracle,SQLServer呢,恐怕只有那套InsideSQLServer了,雖然SQLServer的書籍數量比Oracle的多的多(特別是在國內),但多數都是stepbystep的入門書。12. 對比SQL*Plus與sqlcmd(或2000的osql,6.5的isql),sqlcmd的功能是太簡陋,差得太多了。13. SQLServer的最大優點就是和Windows結合緊密,易用,但是要注意事情都是兩面的,這些優點可能導致其致命的缺點,例如易用,使得搞SQLServer的人可以不求甚解,有時候不求甚解是沒問題的,但是有時候不求甚解可能會造成災難,特別是對搞數據庫的人來說。不好意思,本來要說SQLServer的優點呢,最後也成了缺點了。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved