本文由葡萄城技術團隊於部落格園原創並首發
轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
談起資料庫,事務是繞不開的話題。無論你是研發、實施還是運維,都需要理解、使用無資料事務的特性。資料庫事務連線各種資料,是處理各種資料的基礎。那麼資料庫事務究竟是什麼意思?資料庫事務又有什麼特性呢?下面大家就跟隨本文一起來搞懂資料庫事務吧!
舉個例子: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的更新結果與預期不符,彷彿產生了幻覺。
不可重複讀和幻讀,是兩個容易混淆的概念,不可重複讀是發生在一行資料上的,因此可以通過鎖定行來解決。幻讀是發生在多行記錄中的,因此可以通過鎖定表來解決
為了解決上面的並行問題,資料庫系統提供了隔離級別的概念。
在資料庫中多個SQL語句在同一時刻修改資料,會產生並行控制的問題,如果不加以控制,就會造成事務中的隔離性被破壞,引起不可預知的錯誤。實現並行存取可以採用兩種型別的鎖,即讀鎖/共用鎖和寫鎖/排它鎖:
以上就是資料事務庫的內容與特性,如果您想進一步瞭解與學習,歡迎留言評論與我們交流。