事務隔離級別:乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。
3類資料讀問題(髒讀、不可重複讀和幻象讀)
2類資料更新問題(第一類丟失更新和第二類丟失更新)。
1、幻想讀:事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到t2插入的記錄,這條新紀錄就是幻想。
2、不可重複讀取:事務t1讀取一行記錄,緊接著事務t2修改了t1剛剛讀取的記錄,然後t1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀。
3、髒讀:事務t1更新了一行記錄,還未提交所做的修改,這個t2讀取了更新後的資料,然後t1執行回滾操作,取消剛才的修改,所以t2所讀取的行就無效,也就是髒資料。
4、第一類丟失更新
a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來:
第二類丟失更新
a事務覆蓋b事務已經提交的資料,造成b事務所做操作丟失
oracle資料庫支援read committed 和 serializable這兩種事務隔離級別。所以oracle不支援髒讀
sql標準所定義的預設事務隔離級別是serializable,但是oracle 預設使用的是read committed
事務隔離機制介紹:
例項測試:
但是,真實情況下並不會出現上文中所說的延遲,這是由於資料庫的多版本併發控制mvvc(multi-version concurrency control).
mvvc的介紹:
spring的事務隔離:
spring支援上面說的四種事務隔離機制,還有乙個預設的,表示使用資料庫預設的隔離機制。
下面文章中講解了其中比較難區分的nested和required_new的區別。
事務隔離機制
五年前在論壇上有過一次提問,如下 下面兩個問題的答案就是資料庫的事務隔離機制。資料庫針對外部的併發請求,也是要考慮資源搶占問題的,所以資料庫針對同一記錄的寫請求,也是要加鎖的!最簡單的方式就是針對每個請求都加鎖,全部序列,這樣肯定不會有問題。但這樣效能很低,所以db將鎖分為了讀鎖和寫鎖,也就是常說的...
Mysql事務隔離機制
了解mysql事務隔離機制首先需要理解什麼是acid a 原子性automicity,乙個事務作為不可分割的最小單元,乙個事務裡面的所有操作要麼全部成功,要麼全部失敗。c 一致性consistency,事物結束後系統狀態是一致的,即 資料不能平白無故的產生,也不能平白無故的消失,例如乙個轉賬業務事務...
事務隔離與鎖機制
innodb 儲存引擎既支援行級鎖,也支援表級鎖,預設情況下使用行級鎖。所謂表級鎖,它直接鎖住的是乙個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。所謂頁級鎖,它是鎖住的乙個...