資料庫(一) ACID,事務,隔離級別

2021-09-30 13:43:55 字數 2549 閱讀 6293

事務(transaction),最簡單的理解就是多個對資料庫操作的有序組合。舉例來說,多個順序執行的sql語句就構成了乙個事務。

在現實中,對於資料庫的資料操作,基本以事務為基本單位。

最常見的例子,轉賬時,a賬戶扣掉100,b賬戶增加100,這些操作,都是需要至少兩個以上的sql語句來完成的。從資料庫操作層面上理解,單獨乙個sql無法完成現實中的任務,因此,採用多個sql的有序組合來完成某個現實的任務。

明白了事務的基本含義,事務的特性就可以總結出來了:acid。

開宗明義,acid的解釋如下:

原子性:事務中各項操作,要麼全做要麼全不做

一致性:事務從開始到結尾,保持乙個一致的狀態

隔離性:兩個併發的事務無法知道對方的中間狀態,就好像兩個事務是序列(先後)的一樣

永續性:事務完成後所做的改動都會被持久的儲存到資料庫中,不會回滾

以上是事務的基本特性,除了隔離性,其他三個特性都是針對單個事務的。那麼出現並行的事務時,會有哪些問題呢?

以最通常的銀行轉賬為例,理解各種事務問題的後果

髒讀—dirty read

a事務讀取b事務尚未提交(commit)的資料,而b事務出現回滾。

事務a事務b

開始事務

開始事務

讀取賬戶a的金額為100元

取款50元,賬戶a的餘額修改為50元

讀取賬戶a的金額為50元①

撤銷事務,賬戶a的金額恢復為100元②

取款20元,賬戶a的餘額修改為30元

①:對於剛學習的事務的人來說,這裡或多或少有些困惑,單獨事務的整個過程並不都是在記憶體完成後,在持久化到資料庫中的。上例事務b取出50元的操作,是實際上修改了資料庫賬戶a的餘額(update …)。因此事務a讀取的賬戶餘額是賬戶b修改後的餘額。

②:由於隔離性,此處的回滾並不會知道事務a讀取了b事務修改的資料,因此,回滾是直接回退到事務b開始時的狀態。

於是最後就出現了,賬戶a憑空消失50元的不一致狀態。

在多說一點,會有人有疑問,為什麼事務a取款後的操作,不是update account set money = money - 50 where name = 'a',而是update account set money = 30 where name = 'a',畢竟只要這樣,那麼及時b事務回滾,也不會出現髒讀的問題,或者事務不一致等問題了。但仔細想想,針對事務a,我們在實際操作中,一般是先檢視餘額,有50元,然後取款20(此時事務b回滾),此時賬戶a要是在看一眼餘額,會發現有80元,也會一臉疑惑吧。

不可重複讀—unrepeatable read

事務a重新讀取前面的資料,發現由於事務b的修改,兩次讀取的資料不一樣。

事務a事務b

開始事務

開始事務

讀取賬戶a的金額為100元

讀取賬戶a的金額為100元

取款20,賬戶a餘額80(並提交事務)

讀取賬戶a的金額為80元

字面意思,不需要太多解釋。

幻讀—phantom read

事務a重新讀取的行,由於事務b的修改(一般指插入)而出現了新的行。

事務a事務b

開始事務

開始事務

讀取所有賬戶,總100條記錄

新增乙個賬戶(insert),提交事務

讀取所有賬戶,共101條記錄

上述都是事務併發引起的資料讀取問題,還有兩個資料更新問題如下:

事務a事務b

開始事務

開始事務

檢視賬戶a的餘額為100元

檢視賬戶a的餘額為100元,取出20元,餘額80元

提交事務

取出20元,餘額80元

提交事務(或者撤銷事務)③

③:此處,無論是事務a提交還是撤回,都會出現丟失更新問題。

撤回事務,導致第一類丟失更新;提交事務,導致第二類丟失更新

資料庫的併發訪問會產生上述的問題,通常,資料庫會通過鎖機制來解決資料併發訪問問題,按鎖定物件不同可以分為表級鎖和行級鎖;按併發事務鎖定關係可以分為共享鎖和獨佔鎖(見下一節部落格)。

直接使用鎖是非常麻煩的,為此提供了自動鎖機制,只要使用者指定會話的事務隔離級別,資料庫就會通過分析sql語句然後為事務訪問的資源加上合適的鎖,此外,資料庫還會維護這些鎖通過各種手段提高系統的效能。

四個隔離級別如下:

隔離級別

髒讀不可重複讀

幻讀第一類丟失更新

第二類丟失更新

read uncommited√√√

×√read committed×√√

×√repeatable read××√

××serializable×××

××

資料庫 ACID及事務隔離級別

事務 併發控制和恢復的基本單位。atomicity原子性 事務是資料庫的邏輯工作單位,事務中包括的所有操作要麼都做,要麼什麼都不做。consistency一致性 事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。例如對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後accoun...

資料庫 事務的ACID和隔離級別

寫在前面 在計算機語言中,一般指訪問並更新資料庫中的乙個程式執行單元。事務具有的四個特點,稱為acid。在資料庫的併發訪問中,為了保證資料的讀取正確性,設定的事務的隔離級別。例如 abcde五個賬戶,每個賬戶有100元,共計500元,a給b轉賬10元,b給c轉賬5元,c給d轉賬5元,d給e轉賬10元...

資料庫的事務 ACID及隔離級別

所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,一條或一組sql語句 整個程式都可以是乙個事務。事務和程式是兩個概念,乙個程式中可以有多個事務。在sql中,事務定義的三條語句 begin transaction 開始 commi...