一文帶你搞懂資料庫事務

2023-03-29 12:01:31

本文由葡萄城技術團隊於部落格園原創並首發
轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 

談起資料庫,事務是繞不開的話題。無論你是研發、實施還是運維,都需要理解、使用無資料事務的特性。資料庫事務連線各種資料,是處理各種資料的基礎。那麼資料庫事務究竟是什麼意思?資料庫事務又有什麼特性呢?下面大家就跟隨本文一起來搞懂資料庫事務吧!

一、什麼是事務

舉個例子:A(餘額1500元)向B(餘額500元)銀行轉賬500元,這裡面會涉及到兩個操作。

1、 A的賬戶餘額減少500,此時餘額應為1000元。

2、 B的賬戶餘額增加500,此時餘額應為1000元

如果這兩個操作中間出現了失誤,比如銀行系統突然崩潰了,導致A賬戶餘額減少500,但是B賬戶餘額並沒有增加,這樣的系統明顯是有問題的。要麼A轉賬成功(兩個操作全部完成),要麼A轉賬失敗(兩個操作全部不執行),這樣AB使用者才能接受這樣的轉賬結果。

所以,事務指的就是一個操作,由多個步驟組成,要麼全部成功,要麼全部失敗。

二、理解資料庫的事務

從資料庫的角度來理解,事務指的是對資料庫操作的序列,是一個不可分割的工作單位,這個序列中的操作要麼全部執行,要麼全部不執行。

資料庫事務具有四個特性,稱為 ACID 特性:

1、 原子性

事務是最小的執行單位,不允許分割。事務的原子性保證操作全部執行或全部不執行。

2、 一致性

一致性表示在執行該事務操作前後,從一個正確狀態轉換為另一個正確狀態。以銀行轉賬為例,轉賬前AB餘額共有1500+500合計2000元,轉行後AB餘額應為1000+1000合計2000元,兩種狀態的合計餘額應是一致的,不會多或者少。

3、 隔離性

隔離性表示多個事務並行執行時,相互之間不會產生影響,各並行事務之間資料庫是獨立的。

A向B轉賬過程中,只要事務還未提交,那麼此時AB兩賬戶的餘額不會有變化。如果A向B轉賬(執行了一個事務)的同時,C又向B轉賬(執行了另一個事務),當兩個事務都結束時,B賬戶的餘額應為「原餘額+B轉賬金額+C轉賬金額」。

4、 永續性

一個事務被提交之後,對於資料庫中資料的改變是永久的,即使資料庫發生了故障修改的資料也不會丟失。

三、事務隔離級別

對於兩個並行執行的事務,如果涉及到對同一條資料做的操作,可能會出現以下問題:

1、 髒讀(Ditry Read / Read Uncommitted)

髒讀,是指一個使用者讀取到了另一個使用者沒有提交的資料。如:

使用者A和使用者B提交事務之後,發現最後的庫存為1。但是因為A的提交回滾了,所以正確的庫存應為5。

如何解決髒讀呢?讀已提交。控制一個事務只能讀取其他事務提交後的資料。

2、 不可重複讀(Unrepeatable Read)

不可重複讀,是指同一個事務中,兩次讀取相同資料,返回的結果不一樣。

不可重複讀出現的原因就是事務並行修改記錄,要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這可能導致鎖競爭加劇,影響效能。

3、 幻讀(Phantom Read)

前面講的不可重複讀是發生在兩次讀取之間,資料被更新了的情況。如果兩次操作之間,插入了新的資料呢?

上面例子中,使用者B的更新結果與預期不符,彷彿產生了幻覺。

不可重複讀和幻讀,是兩個容易混淆的概念,不可重複讀是發生在一行資料上的,因此可以通過鎖定行來解決。幻讀是發生在多行記錄中的,因此可以通過鎖定表來解決

為了解決上面的並行問題,資料庫系統提供了隔離級別的概念。

  • Read uncommitted (讀未提交):最低階別,以上問題均無法解決。
  • Read committed (讀已提交):讀已提交,可以避免髒讀問題發生。
  • Repeatable Read(可重複讀):確保事務可以多次從一個欄位中讀取相同的值,在此事務持續期間,禁止其他事務對此欄位進行更新,可以避免髒讀和不可重複讀,仍會出現幻讀問題。
  • Serializable (序列化):最嚴格的事務隔離級別,要求所有事務被序列執行,不能並行執行,可避免髒讀、不可重複讀、幻讀情況的發生。

四、資料庫鎖

在資料庫中多個SQL語句在同一時刻修改資料,會產生並行控制的問題,如果不加以控制,就會造成事務中的隔離性被破壞,引起不可預知的錯誤。實現並行存取可以採用兩種型別的鎖,即讀鎖/共用鎖和寫鎖/排它鎖:

  • 讀鎖/共用鎖:共用的鎖,多個使用者端可以同時讀取一個資源,互補干擾。如事務A對資料加上共用鎖,那麼事務B可以讀取資料,不能修改資料。
  • 寫鎖/排它鎖:一個鎖會阻塞其他的寫鎖和讀鎖,確保一個時刻只有一個事務對資料進行修改寫入。如事務A對資料加上排他鎖,那麼事務B不能讀取資料,也不能修改資料。

以上就是資料事務庫的內容與特性,如果您想進一步瞭解與學習,歡迎留言評論與我們交流。