
2009年4月13日
1, 臟讀
一個事務(wù)讀到另一個事務(wù),尚未提交的修改,就是臟讀。這里所謂的修改,除了Update操作,不要忘了,還包括
Insert和Delete操作。
臟讀的后果:如果后一個事務(wù)回滾,那么它所做的修改,統(tǒng)統(tǒng)都會被撤銷。前一個事務(wù)讀到的數(shù)據(jù),就是垃圾數(shù)據(jù)。
舉個例子:預(yù)訂房間。
有一張Reservation表,往表中插入一條記錄,來訂購一個房間。
事務(wù)1:在Reservation表中插入一條記錄,用于預(yù)訂99號房間。
事務(wù)2:查詢,尚未預(yù)定的房間列表,因為99號房間,已經(jīng)被事務(wù)1預(yù)訂。所以不在列表中。
事務(wù)1:信用卡付款。由于付款失敗,導(dǎo)致整個事務(wù)回滾。
所以插入到Reservation 表中的記錄并不置為持久(即它將被刪除)。
現(xiàn)在99號房間則為可用。
所以,事務(wù)2所用的是一個無效的房間列表,因為99號房間,已經(jīng)可用。如果它是最后一個沒有被預(yù)定的房間,那么這將是一個嚴重的失誤。
注:臟讀的后果很嚴重。
2,不可重復(fù)讀。
在同一個事務(wù)中,再次讀取數(shù)據(jù)時【就是你的select操作】,所讀取的數(shù)據(jù),和第1次讀取的數(shù)據(jù),不一樣了。就是不可重復(fù)讀。
舉個例子:
事務(wù)1:查詢有雙人床房間。99號房間,有雙人床。
事務(wù)2:將99號房間,改成單人床房間。
事務(wù)1:再次執(zhí)行查詢,請求所有雙人床房間列表,99號房間不再列表中了。也就是說,
事務(wù)1,可以看到其他事務(wù)所做的修改。
在不可重復(fù)讀,里面,可以看到其他事務(wù)所做的修改,而導(dǎo)致2次的查詢結(jié)果不再一樣了。
這里的修改,是提交過的。也可以是沒有提交的,這種情況同時也是臟讀。
如果,數(shù)據(jù)庫系統(tǒng)的隔離級別。允許,不可重復(fù)讀。那么你啟動一個事務(wù),并做一個select查詢操作。
查詢到的數(shù)據(jù),就有可能,和你第2次,3次...n次,查詢到的數(shù)據(jù)不一樣。一般情況下,你只會做一次,select
查詢,并以這一次的查詢數(shù)據(jù),作為后續(xù)計算的基礎(chǔ)。因為允許出現(xiàn),不可重復(fù)讀。那么任何
時候,查詢到的數(shù)據(jù),都有可能被其他事務(wù)更新,查詢的結(jié)果將是不確定的。
注:如果允許,不可重復(fù)讀,你的查詢結(jié)果,將是不確定的。一個不確定的結(jié)果,你能容忍嗎?
3,幻讀
事務(wù)1讀取指定的where子句所返回的一些行。然后,事務(wù)2插入一個新行,這個新行也滿足事務(wù)1使用的查詢
where子句。然后事務(wù)1再次使用相同的查詢讀取行,但是現(xiàn)在它看到了事務(wù)2剛插入的行。這個行被稱為幻象,
因為對事務(wù)1來說,這一行的出現(xiàn)是不可思議的。
舉個例子:
事務(wù)1:請求沒有預(yù)定的,雙人床房間列表。
事務(wù)2:向Reservation表中插入一個新紀錄,以預(yù)訂99號房間,并提交。
事務(wù)1:再次請求有雙人床的未預(yù)定的房間列表,99號房間,不再位于列表中。
注:幻讀,針對的是,Insert操作。如果事務(wù)2,插入的記錄,沒有提交。那么同時也是臟讀。
posted @
2009-04-13 12:37 liulang 閱讀(7331) |
評論 (0) |
編輯 收藏