一個事務讀取另一個事務未提交的內容,稱為臟讀。但事務的隔離性定義中又有這樣的描述:“當前事務不會查看由另一并發事務正在修改的資料。“
在臟讀時,一個事務讀取了另一個事務未提交的內容,難道未提交的內容不算是另一并發事務正在修改的資料嗎?如果不算,事務的隔離性如何體現呢,什么才算是”事務正在修改的資料?
自學Mysql中,有些抽象的概念還是有些模糊,希望各位高人不吝賜教。
uj5u.com熱心網友回復:
有些應用在做某些查詢的時候不關心資料的精確,而是關系速度,這時使用臟讀就可以成為一種選擇。uj5u.com熱心網友回復:
首先謝謝版主的回答,提到了需要根據具體的使用情況選擇資料準確度和速度的一個均衡。
不過我還是有些關心概念上的問題,臟讀是不是違反了事務的隔離性。如果是的話,僅僅引入事務的概念,看起來就已經解決了臟讀的問題,因為事務的隔離性要求一個事務不能讀另外事務正在修改的資料,也就是未提交的資料。這樣理解正確嗎?
uj5u.com熱心網友回復:
建議樓主先看一下事務隔離模式的幾種不同和適用范圍,否則不知道從哪兒談起了。uj5u.com熱心網友回復:
樓主哪里看到的這種說法?關于事務,很多代碼最后都是判斷操作是否成功,成功則提交,不成功則回滾。。
為什么他們不直接提交呢?非要先來個判斷回滾
uj5u.com熱心網友回復:
一個事務讀取另一個事務未提交的內容,稱為臟讀。
這個問題就是 因為沒有提交,比如,一條資料有個欄位 v,現在有個事務A把這個v從10改成了100,但是呢,沒有commit,
這個時候另一個事務B 如果讀取了值,也就是100,而這個時候,剛才事務A因為其他原因 把事務rollback了,
那么這時候事務B讀取到的就是不準確的資料,這就是臟讀。
當然,如果事務A最后提交了,那么事務B讀取到的也是正確的資料,但這個也是臟讀。
所以,是不是臟讀和 讀取到的資料是否正確沒有關系,只是說 讀取到的是 不確定的資料。
uj5u.com熱心網友回復:
另外,在mysql中是無法讀取到臟資料的,因為myisam存盤引擎是 表級別的鎖,并發性很差。
而innodb存盤引擎,支持mvcc,多版本并發控制,你讀取到的 總是已提交的資料。
而在oracle中也是如此。
那么現在說到 能讀取臟資料,那只有 sql server了,你可以在查詢中指定 nolock,或者 指定隔離級別為 read uncommitted,這個就是臟讀,也就是說 可以讀取到未提交的資料,那么好處是 在讀取資料時 不需要 讀鎖,所以不會被修改資料的事務 鎖定。
uj5u.com熱心網友回復:
我也一直弄不明白這個概念上的定義。事務A讀取了事務B中正在修改的資料。那么事務A本身就違背了自身的隔離性原則。它還算是個事務嗎?
uj5u.com熱心網友回復:
讀取了事務B中正在修改的資料。事務隔離級別為未提交(uncommited)讀才會這樣cmmited級別不會出現臟讀。
uj5u.com熱心網友回復:
事務的隔離是有級別的uj5u.com熱心網友回復:
隔離的具體行為取決于隔離級別設定,默認的隔離級別滿足不允許臟讀,也就是滿足我們經常看到的對事務的隔離性的說明的這句uj5u.com熱心網友回復:
成功提交,不成功回滾,這很正常從內部實作來講,寫入資料的時候,如果某些資料不合法,那么就是不成功,不是回滾難道還提交?
從業務實作的角度(自己控制事務),如果某些資料不滿足業務規則,難道你也提交?或者說你不管是否符合業務規則,只管把資料寫進去?
uj5u.com熱心網友回復:
或者你會想到先判斷業務規則,不滿足條件則不寫,但這只是代表寫資料的一種實作方式,并不是所有情況都能使用這種方式uj5u.com熱心網友回復:
樓主可以先學習一下隔離級別的概念。不同的需求需要不同的隔離級別。最低級別的隔離級別支持臟讀,高一些的隔離級別不支持臟讀。
uj5u.com熱心網友回復:
事務的隔離性并不是:A事務修改的東西,B看不到。這句話只是事務的隔離性中的隔離級別之一
什么違反了隔離性簡直是謬論,最低的一層隔離級別的時候,A事務修改的東西,B當然看得到!
uj5u.com熱心網友回復:
這種違反只要不影響業務的正常處理,是沒關系的至于是不是會影響業務的正常處理,需要具體情況具體分析
比如有一個論壇,一個人在發貼子,發了帖子之后要更新此人的發貼數啊,最后活動時間啊,金幣啊等等亂七八糟的東西,可能還有更新全域的論壇發貼數量,我們可以把這些看成是一個事務。另外有一個需要讀取當天所有人發貼數的地方,這個并不需要在這個事務跑完再讀取,臟讀讀到的結果完全可以滿足我們的需要,我們就可以在這個場景下使用臟讀。而如果完全事務隔離,因為可能同時有很多人在發貼,就會影響讀取的效率
uj5u.com熱心網友回復:
在mysql中如何實作讀取事務“未提交”的資料呢?
Read Uncommitted讀未提交級別可以實作嗎?
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/81776.html
標籤:MySQL
