事務的ACID特性

2021-08-20 12:04:05 字數 2722 閱讀 3026

acid特性

資料庫中的事務(transaction)有四個特性,分別是:原子性(atomicity),一致性(consistency),隔離性(lsolation),永續性(durability)

所謂事務,它是一系列操作的序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。(執行邏輯功能的一組指令或者操作稱之為事務)

詳解

1. 原子性

原子性是指乙個事務是乙個不可再分割的工作單位,事務中的操作要麼都執行,要麼都不執行

例如:a給b轉賬,如果b的賬戶操作失敗,則本次交易失敗,a和b的賬戶都不會進行修改。

2. 一致性

一致性是指在執行乙個事務前和後,資料庫的完整性約束沒有沒有被破壞。也就是說事務不能破壞資料庫的完整性以及業務邏輯的一致性。

例如:業務邏輯一致性:a給b轉賬,無論是否操作成功,兩者的賬戶餘額之和應該是不變的。

資料庫完整性:資料庫的約束關係應該是正確的,例如唯一索引,主鍵等。

3. 隔離性

隔離性是指多個事務併發時,每個事務應該是隔離的,乙個事務不應影響其他事務的執行效果

在併發環境當中,當不同的事務訪問相同的資料時,每個事務都有各自的完整的資料空間,由於併發事務所做的修改必須與併發的其他事務的修改隔離,所以事務檢視資料更新時,資料所處的狀態要麼是另乙個事務開始前的狀態,要麼就是另乙個事務結束後的狀態,不會檢視到中間狀態資料。

事務最複雜的問題都是由隔離性引起的,但是完全的隔離是不現實的,完全的隔離要求資料庫同一時間只能執行乙個事務,這樣會嚴重影響效能。

事務併發問題

要了解事務的隔離級別,那麼就要先了解事務併發會面臨的問題

1.髒讀:事務a讀取了事務b的更新的資料,但是事務b回滾了,導致a讀取的為髒資料。

2.不可重複讀:事務a讀取同一資料兩次,但是在兩次之間事務b對該資料進行了修改並提交,導致事務a讀取兩次讀取不一致

3.幻讀:所謂幻讀,就是同乙個事務,連續做兩次當前讀 (例如:select * from t1 where id = 10 for update;),那麼這兩次當前讀返回的是不相同的記錄

注意:不可重複讀和幻讀很容易混淆,不可重複讀針對的時資料的修改,幻讀針對的時資料的新增和刪除。解決不可重複讀問題只需要給對應記錄上行鎖,而解決幻讀需要對錶加鎖。

隔離級別

1. 未提交讀(read uncommitted),就是不做隔離控制,可以讀到「髒資料」,比如a和b轉賬,當a賬戶修改後,在執行b賬戶修改時,事務還未提交,其他事務同樣需要讀取a賬戶的資料,那麼這個時候是可以讀到a賬戶修改後資料的。但是這個時候如果處理失敗,則會導致其他事務讀取的a賬戶的資料是錯誤的,這個問題就叫做髒讀。顯然這個隔離級別沒有太大意義,現實中沒有人會用,除非這個應用只有讀取,沒有任何寫入。 

2. 提交讀(read committed),提交讀就是不允許讀取事務沒有提交的資料。顯然這種級別可以避免了髒讀問題。例如a和b轉賬,當a賬戶修改後,在執行b賬戶修改時,事務還未提交,其他事務同樣讀取a賬戶的資料,那麼這個時候讀取的應該是事務開始前的資料(也就是a賬戶修改前的資料)。但是當其他事務在事務開始前讀取,同時在事務結束後讀取,這樣會造成兩次讀取資料不一致的情況(因為兩次查詢到的資料是不一樣,所以這個問題叫做不可重複讀)。這個隔離級別是大多數資料庫(除了mysql)的預設隔離級別。 

3. 可重複讀(repeatable read),與提交讀(不可重複讀)相對應,為了避免提交讀級別不可重複讀的問題,在事務中對查詢記錄上共享鎖,對符合條件的修改記錄上排他鎖,這樣其他事務不能對該事務的查詢資料和修改資料上排他鎖(共享鎖特性),那麼就不能對事務涉及到的資料進行修改。可避免不可重複讀的問題產生。由於只對運算元據進行上鎖的操作,所以當其他事務插入或刪除資料時,會出現幻讀的問題,此種隔離級別為mysql預設的隔離級別。

4. 序列化(serializable),在事務中對錶上鎖,這樣在事務結束前,其他事務都不能夠對錶資料進行操作(包括新增,刪除和修改),這樣避免了髒讀,不可重複讀和幻讀,是最安全的隔離級別。但是由於該操作是堵塞的,不能夠讓其他事務進行操作,因此此種隔離級別效能會受到影響。

隔離級別解決事務併發問題表

事務隔離級別

髒讀(dirty read)

不可重複讀(no repeatable redad)

幻讀(phantom read)

讀未提交(read-uncommitted)是是

是不可重複讀(read-committed)否是

是可重複讀(repeatable-read)否否

是序列化(serializable)否否

4. 永續性

永續性意味著事務執行完成後,該事務對資料庫的更改便持久到了資料庫中,這個更改是永久的。

事務特性(ACID)

原子性 是指事務乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。不能夠單獨執行。把一組操作放入事務中 一致性 事務的執行的前後,資料的完整性要得到保證。隔離性 強調的是多個使用者併發訪問資料庫的時候,乙個使用者事務不能被其他使用者的事務所干擾到,多個併發事務之間的資料要相互隔離。解決多...

事務ACID特性

所謂事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉帳工作 從乙個帳號扣款並使另乙個帳號增款,這兩個操作要麼都執行,要麼都不執行。資料庫事務必須具備acid特性,acid是atomic 原子性 consistency 一致性 isolation 隔離...

事務ACID特性

所謂事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉帳工作 從乙個帳號扣款並使另乙個帳號增款,這兩個操作要麼都執行,要麼都不執行。資料庫事務必須具備acid特性,acid是atomic 原子性 consistency 一致性 isolation 隔離...