資料庫的四大特性以及四個隔離級別和引發的問題

2022-04-05 05:32:33 字數 2454 閱讀 5522

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾。失敗回滾的操作事務,將不能對事務有任何影響。

一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。

例如:a和b進行轉賬操作,a有200塊錢,b有300塊錢;當a轉了100塊錢給b之後,他們2個人的總額還是500塊錢,不會改變。

隔離性是指當多個使用者併發訪問資料庫時,比如同時訪問一張表,資料庫每乙個使用者開啟的事務,不能被其他事務所做的操作干擾(也就是事務之間的隔離),多個併發事務之間,應當相互隔離。

例如同時有t1和t2兩個併發事務,從t1角度來看,t2要不在t1執行之前就已經結束,要麼在t1執行完成後才開始。將多個事務隔離開,每個事務都不能訪問到其他事務操作過程中的狀態;就好比上鎖操作,只有乙個事務做完了,另外乙個事務才能執行。

永續性是指事務的操作,一旦提交,對於資料庫中資料的改變是永久性的,即使資料庫發生故障也不能丟失已提交事務所完成的改變。

事務的隔離級別從低到高分別是:讀未提交,讀已提交,可重複讀,序列化,這四個隔離級別可以分別解決髒讀,不可重複讀,幻讀的問題。

很明顯的看出,旺財對a新增的20塊不翼而飛了,這就是「資料丟失」,對事務不加任何鎖(不存在事務隔離),就會導致這種問題。

操作:寫資料的時候新增乙個x鎖(排他鎖),也就是在寫資料的時候不允許其他事務進行寫操作,但是讀不受限制,讀不加鎖。

這樣就可以解決了多個人一起寫資料而導致了「資料丟失」的問題,但是會引發新的問題——髒讀。

髒讀:讀取了別人未提交的資料。

因而引入了另外乙個事務隔離級別——讀已提交

操作:寫資料的時候加上x鎖(排他鎖),讀資料的時候新增s鎖(共享鎖),而且有約定:如果乙個資料加了x鎖就沒法加s鎖;同理如果加了s鎖就沒法加x鎖,但是乙個資料可以同時存在多個s鎖(因為只是讀資料),並且規定s鎖讀取資料,一旦讀取完成就立刻釋放s鎖(不管後續是否還有很多其他的操作,只要是讀取了s鎖的資料後,就立刻釋放s鎖)。

這樣就解決了髒讀的問題,但是又有新的問題出現——不可重複讀。

不可重複讀:同乙個事務對資料的多次讀取的結果不一致

解決方法——引入隔離級別更高事務隔離:可重複讀

操作:對s鎖進行修改,之前的s鎖是:讀取了資料之後就立刻釋放s鎖,現在修改是:在讀取資料的時候加上s鎖,但是要直到事務準備提交了才釋放該s鎖,x鎖還是一致。

這樣就解決了不可重複讀的問題了,但是又有新的問題出現——幻讀。

例如:有一次旺財對乙個「學生表」進行操作,選取了年齡是18歲的所有行, 用x鎖鎖住, 並且做了修改。

改完以後旺財再次選擇所有年齡是18歲的行, 想做乙個確認, 沒想到有一行竟然沒有修改!

這是怎麼回事? 出了幻覺嗎?

原來就在旺財查詢並修改的的時候, 小強也對學生表進行操作, 他插入了乙個新的行,其中的年齡也是18歲! 雖然兩個人的修改都沒有問題, 互不影響, 但從最終效果看, 還是出了事。

碼農翻身注: 正是小強的操作, 讓旺財出現了「幻讀」)

解決幻讀的方式——序列化

事務只能一件一件的進行,不能併發進行。

總結:

mysql預設的隔離級別是:可重複讀。

oracle中只支援2個隔離級別:讀已提交和序列化,預設是讀已提交。

第一正規化:乙個單元格只儲存乙個值。

第二正規化:滿足所有的屬性字段唯一依賴主鍵

第三正規化:消除傳遞依賴,例如:訂單號----決定----->使用者id------決定------>使用者名稱;這個時候我們就需要消除這種依賴傳遞;但是又時候也得兼顧查詢效率,高查詢率低修改率的字段可以考慮違反第三正規化。

參考:劉欣《碼農翻身》中的資料庫村的旺財和小強

資料庫四大特性 隔離級別

原子性 要麼全部成功 要麼全部失敗回滾。隔離性 多個使用者併發的訪問資料庫,或操作同一張表,資料庫為每乙個使用者開啟事務,不能被其他事務干擾,併發事務需要隔離。一致性 乙個事務從乙個事務執行之前和執行之後都必須處於一致性的狀態。永續性 乙個事務一旦被提交,那麼對於資料庫中的資料操作是永久性的。髒讀,...

資料庫事務的四大特性以及隔離級別

本篇文章主要介紹資料庫事務的四大特性acid,以及資料庫的隔離級別。事務指的是滿足 acid 特性的一系列操作。在資料庫中,可以通過 commit提交乙個事務,也可以使用 rollback 進行回滾。原子性 atomicity 事務被視為不可分割的最小單元,要麼全部提交成功,要麼全部失敗回滾。一致性...

資料庫事務的四大特性以及四種隔離級別

首先什麼是事務?這是來自官方的解釋 資料庫事務 transaction 是訪問並可能操作各種資料項的乙個資料庫操作序列,這些操作要麼全部執行,要麼全部不執行,是乙個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部資料庫操作組成,簡單的來說就是我們執行一件事情從頭到尾的過程。任何支援事務的資...