資料庫事務的四個特性ACID

2022-08-19 11:42:12 字數 1727 閱讀 6284

原子性指的指的就是這個操作,要麼全部成功,要麼全部失敗回滾。不存在其他的情況。

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

舉個例子。就是a和b的錢是1000元,a給你100元,無論最後雙方轉了多少次,總的錢一定是1000元。

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

永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。

髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。

比如a轉賬給b100元,然後還沒有提交成功,這個時候,你用b用手機付款,這個事務讀取到這個100了。然後就行了扣款,b讀到的這個資料就是髒資料。因為a沒有提交,可能會撤銷。

不可重複讀是指在對於資料庫中的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另乙個事務修改並提交了。不可重複讀一般是update操作

舉例:比如a事務 讀取了乙個記錄,然後此時b事務修改了這個記錄會提交了,a事務再進行讀取的時候就會跟之前的記錄不一樣。 會產生我們說的aba問題。

幻讀是事務非獨立執行時發生的一種現象。例如事務t1對乙個表中所有的行的某個資料項做了從「1」修改為「2」的操作,這時事務t2又對這個表中插入了一行資料項,而這個資料項的數值還是為「1」並且提交給資料庫。而操作事務t1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務t2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。 幻讀一般是insert操作

舉例:程式設計師某一天去消費,花了2千元,然後他的妻子去檢視他今天的消費記錄(全表掃瞄fts,妻子事務開啟),看到確實是花了2千元,就在這個時候,程式設計師花了1萬買了一部電腦,即新增insert了一條消費記錄,並提交。當妻子列印程式設計師的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted 、read committed 、repeatable read 、serializable 。

read uncommitted 未提交讀

最低的隔離,就是可以讀取到未提交的資料。會產生髒讀。

a給b轉賬1000元。開啟事務,還沒提交。 此時b檢視自己餘額多了1000元。但是突然a輸錯了密碼。放棄了轉款,回滾。此時這個b看到1000元就是乙個髒資料,因為事務沒有提交完成。

read committed 提交讀

就是乙個事務要等另乙個事務提交後才能讀取資料。

比如a的卡里有1000元。去請吃飯花付錢需要花900元。然後此時他媳婦b取出了500.當結賬的時候,就會出現付款失敗。出現這種情況,就是因為出現了b取錢的時候,沒有等待a刷卡這個事務完成,而自己的事務開始讀取和提交了資料。

repeatable read 重複讀 

重複讀,就是在開始讀取資料(事務開啟)時,不再允許修改操作。mysql預設的事務隔離級別是rr 重複讀

比如上面的例子。當a進行付款的時候,b取款的操作就應該等待,不允許進行修改。

serializable 序列化

serializable 是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

序列化就是將並行的操作。改成順序執行。

事務的四個特性 ACID

事務是使用者定義的乙個資料庫操作的序列,這些操作要麼去做要麼全不做,是乙個不可分割的工作單位。事務具有四個特徵 原子性 atomicity 一致性 consistency 隔離性 isolation 和持續性 durability 簡稱為 acid 特性。原子性 atomicity 乙個事務是乙個不...

事務的四個特性 ACID

事務是恢復和併發控制的基本單位。事務應該具有4個屬性 原子性 一致性 隔離性 永續性。這四個屬性通常稱為acid特性。原子性 atomicity 乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。一致性 consistency 事務必須是使資料庫從乙個一致性狀態變到另乙個一致...

事務的四個特性 ACID

原子性 atomicity 操作這些指令時,要麼全部執行成功,要麼全部不執行。只要其中乙個指令執行失敗,所有的指令都執行失敗,資料進行回滾,回到執行指令前的資料狀態。eg 拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是20000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢...