資料庫事務問題

2021-10-24 08:34:45 字數 2617 閱讀 2037

事務是由一組 sql 語句組成的邏輯處理單元。

acid:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、 永續性(durability)。

原子性:乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成, 不會結束在中間某個環節。事務在執行過程中發生錯誤,會被 回滾 (rollback)到事務開 始前的狀態,就像這個事務從來沒有執行過一樣。

一致性:在事務開始和完成時,資料庫中的資料都保持一致的狀態,資料的完整性約 束沒有被破壞。(事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀)。具體 來說就是,比如表與表之間存在外來鍵約束關係,那麼你對資料庫進行的修改操作就必需要 滿足約束條件,即如果你修改了一張表中的資料,那你還需要修改與之存在外來鍵約束關係 的其他表中對應的資料,以達到一致性。

隔離性:乙個事務的執行不能被其他事務干擾。為了防止事務操作間的混淆,必須串 行化或序列化請求,使得在同一時間僅有乙個請求用於同一資料。(在事務正確提交之前, 不允許把該事務對資料的任何改變提供給任何其他事務)。(事務處理過程中的中間狀態 對外部是不可見的)。隔離性通過鎖就可以實現。

**永續性:**乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,並不會被 回滾。

更新丟失

兩個事務 tl 和 t2 讀入同一資料並修改,t2 提交的結果覆蓋了 tl 提交 的結果,導致 tl 的修改被丟失。

髒讀

事務 tl 修改某一資料,並將其寫回磁碟,事務 t2 讀取同一資料後,tl 由 於某種原因被撤銷,這時 tl 已修改過的資料恢復原值,t2 讀到的資料就與數 據庫中的資料不一致,則 t2 讀到的資料就為「髒」資料,即不正確的資料。

例如:張三的工資為 5000,事務 a 中把他的工資改為 8000,但事務 a 尚未提交。 與此同時,事務 b 正在讀取張三的工資,讀取到張三的工資為 8000。隨後, 事務 a 發生異常,而回滾了事務。張三的工資又回滾為 5000。最後,事務 b 讀 取到的張三工資為 8000 的資料即為髒資料,事務 b 做了一次髒讀。

不可重複讀

是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一 個事務也訪問該同一資料。那麼,在第乙個事務中的兩次讀資料之間,由於第 二個事務的修改,那麼第乙個事務兩次讀到的的資料可能是不一樣的。這樣就 發生了在乙個事務內兩次相同的查詢讀到的資料是不一樣的,因此稱為是不可 重複讀。

例如:在事務 a 中,讀取到張三的工資為 5000,操作沒有完成,事務還沒提交。 與此同時,事務 b 把張三的工資改為 8000,並提交了事務。隨後,在事務 a 中, 再次讀取張三的工資,此時工資變為 8000。在乙個事務中前後兩次讀取的結果 並不致,導致了不可重複讀。

幻讀

例如:目前工資為 5000 的員工有 10 人,事務 a 讀取所有工資為 5000 的人數為 10 人。此時,事務 b 插入一條工資也為 5000 的記錄。這是,事務 a 再次讀取 工資為 5000 的員工,記錄為 11 人。此時產生了幻讀。

不可重複讀的重點是修改:

同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了。

幻讀的重點在於新增或者刪除:

同樣的條件,第 1 次和第 2 次讀出來的記錄數不一樣。

避免不一致性的方法和技術就是併發控制。最常用的技術是封鎖技術。

加鎖,如樂觀鎖和悲觀鎖。

資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力, 使它們 不會相互影響, 避免各種併發問題。

資料庫提供了 4 種隔離級別(由低到高):

這 4 個級別可逐個解決髒讀,不可重複讀和幻讀這幾個問題。

1.讀未提交資料

允許事務讀取未被其他事務提交的變更,可能有髒讀, 不可重複讀和幻讀的問題。      比如:某時刻會話 a 修改了乙個資料,但還未提交,此時會話 b 讀取了該資料,這是, 會話 a 回滾了事務,這就導致資料出現了不一致狀態,這就是髒讀。

2.讀已提交資料

允許事務讀取已經被其他事務提交的變更,可以避免髒讀,可能有不可重複讀和幻讀 的問題。

例如:某時刻會話 a 的乙個事務裡查詢乙個資料,得到的資料是 1,這時會話 b 修改 了該資料的值為 2,並提交了, 此時會話 a 的事務又要讀取該資料,這時的資料是 2,就樣 就出現了同乙個事務內,讀的結果不一樣,這就是不可重複讀。

不可重複讀,是指在資料庫訪問中,乙個事務範圍內兩個相同的查詢卻返回了不同數 據。

3.可重複讀(mysql 的預設隔離級別)

確保事務可以多次從乙個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務 對這個字段進行更新,可以避免髒讀和不可重複讀,可能會有幻讀。

4.可序列化

所有事務都乙個接乙個地序列執行。可以避免髒讀,不可重複讀,幻讀。

*begin 或 start transaction:*顯示地開啟乙個事務;      commit:提交事務,並使已對資料庫進行的所有修改稱為永久性的;      rollback:回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;

資料庫事務併發問題

乙個資料庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有採取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為 5類,包括 3類資料讀問題 髒讀 幻象讀和不可重複讀 以及 2類資料更新問題 第一類丟失更新和第二類...

資料庫事務併發問題

多個事務同時訪問資料庫時候,會發生下列5類問題,包括3類資料讀問題 髒讀,不可重複讀,幻讀 2類資料更新問題 第一類丟失更新,第二類丟失更新 1,髒讀 dirty read a事務讀取b事務尚未提交的更改資料,並在這個資料基礎上操作。如果b事務回滾,那麼a事務讀到的資料根本不是合法的,稱為髒讀。在o...

資料庫事務ACID問題介紹

一 事務的基本要素 acid 事務是由一組sql語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的acid屬性。原子性 atomicity 指整個資料庫事務是不可分割的工作單位。只有使據庫中所有的操作執行成功,才算整個事務成功 事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語...