一致和并發(fā)是對(duì)立的,需要根據(jù)應(yīng)用,選擇權(quán)宜之計(jì)
數(shù)據(jù)不一致的現(xiàn)象
---事務(wù)內(nèi)單SQL的情況---
1.
臟讀-Dirty Read:本事務(wù)讀取了其它事務(wù)尚未提交的修改數(shù)據(jù)
例子:讀了不該讀的
1:00 x=1
1:01 A用戶 Update x=2(但未commit)
1:02 B用戶 Select x --> x=2
合理的情況是x仍然等于1---事務(wù)內(nèi)多SQL的情況(典型的如,先查再改)---2.
不可重復(fù)讀-Non Repeatable Read
例子1:自相矛盾
1:00 x=1 y=2
1:01 B用戶 Select x,y --> x=1 y=2
1:02 A用戶 Update x=2; Commit;
1:03 B用戶 Select x+y --> x+y=4
首先這個(gè)結(jié)果從單條SQL的角度看,是沒(méi)有問(wèn)題的。但是,如果把B的兩次查詢看作一個(gè)整體(事務(wù)),那么合理的情況應(yīng)該是
? x+y仍然等于3
? 或者B再進(jìn)行一次事務(wù),得出 x=2 y=2 x+y=4 的結(jié)果例子2:更新丟失
1:00 x=1
1:01 B用戶 Select x --> x=1
1:02 A用戶 Select x --> x=1
1:03 A用戶 Update x=2; Commit;
1:04 B用戶 Update x=3; Commit;
同樣,從單條SQL來(lái)講,沒(méi)有任何問(wèn)題。
但是從邏輯的合理性講,一般的更新操作都是先查再改,換言之
? A真正想做的是Update x from 1 to 2
? B真正想做的是Update x from 1 to 3
但最終卻造成了在B不知情的情況下,把B的初衷改為了Update x from 2 to 33.
幻影讀-Phantom Read
例子:讀到了未來(lái)
1:00 X1=1 X2=2
1:01 B用戶 Select Xi --> X1=1 X2=2
1:02 A用戶 Insert X3=3; Commit;
1:03 B用戶 Select sum(Xi) --> re=6
其實(shí)道理和之前的不可重復(fù)讀相同,只不過(guò)是由Insert引起的罷了。
(甚至Delete也會(huì)引起類(lèi)似的問(wèn)題,但好像學(xué)術(shù)界并沒(méi)有對(duì)Delete進(jìn)行討論)Isolation LevelRead Uncommitted:1,2,3都會(huì)發(fā)生
? Oracle中嚴(yán)格禁止臟讀
? 在SQL Server 7.0中,是可以選擇該級(jí)別的
Read Committed:發(fā)生2,3(Oracle的默認(rèn)級(jí)別)
Repeatable Read:發(fā)生3
Serializable:都不發(fā)生
Oracle的實(shí)現(xiàn)方式Read Committed:默認(rèn)就實(shí)現(xiàn)
Repeatable Read:
? 1. 悲觀鎖(select ... for update),影響并發(fā)
? 2. 樂(lè)觀鎖(update where 所有字段都作為條件),不影響并發(fā)
Serializable:
? alter session set isolation_level=serializable/read only
posted on 2009-12-05 17:45
Jcat 閱讀(217)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Database