三大關係型數據庫事務詳解之一:基本概念

1、基本概念數據庫

  假設用戶A要從他的帳戶裏面給B轉帳1000元,那麼就須要兩步來實現,首先從A的帳號減去1000元,再給B帳號加1000元。這兩個步驟中,任何一步都不能少或者出錯,這兩步要麼都獲得成功操做完成,要麼什麼都不作,中途出錯也要回滾到轉帳開始以前的狀態。這樣的一個過程就是咱們常常說的事務。根據這個例子,下來咱們就給事務定義以下:併發

  事務transaction)是爲了保證數據的一致性和完整性,由一系列數據操做或指令組成的一個不可分割的邏輯單元,這些操做或指令要麼全都獲得執行,要麼全都不執行。若是事務成功執行,則該事務中對全部數據所作的更改均會成爲數據庫中持久性更改;若是事務執行過程當中遇到錯誤,則全部執行的操做和更改均應獲得取消,回滾到事務執行前的狀態。從定義看,事務應該知足四個屬性,即ACID,也就是原子性、一致性、隔離性、持久性。spa

  • 原子性(Atomicity,或稱不可分割性):事務中的全部操做,要麼所有都成功執行,要麼所有都沒有執行完成。這種不可中斷的一系列操做就是原子性。轉帳過程當中,A帳號減去1000元和B帳號加1000元,必須都獲得執行,或者都不執行,不然都不符合邏輯和實際狀況。日誌

  • 一致性(Consistency):事務開始以前和事務完成之後,全部相關的數據狀態都會保持一致,不會使數據庫的完整性獲得破壞。原子性會確保數據保持一致性,轉帳過程產生中斷,第一步執行了,第二步沒有執行,這個時候,只是A帳號少了1000元,而B帳號沒有加1000元,這個時候,數據就不一致了。事務

  • 隔離性(Isolation,又稱獨立性):數據庫中多個併發事務同時執行時,一個事務的執行不能受到其餘事務的干擾,也就是說,一個事務內的操做和使用的數據對其餘事務是隔離的,不會受到其餘併發的事務影響。例如:事務查看數據所處的狀態,要麼是另外一個併發事務的修改以前的狀態,要麼就是另外一個事務修改以後的狀態,不會是中間狀態的數據。內存

  • 持久性(Durability):事務執行完後,對數據的修改就是永久的,即使系統出現故障,不會產生回滾,也不會影響到執行結果。ci

2、事務的運行模式it

一般,事務以3種模式運行,他們分別是:自動提交事務、顯式事務和隱式事務。io

1. 自動提交事務table

每一條單獨的SQL語句都在其執行完成後進行自動提交事務,即執行 SQL 語句後就會立刻自動隱式執行 COMMIT 操做。若是出現錯誤,則進行事務回滾至以前狀態。

2. 顯式事務

經過指定事務開始語句來顯式開啓事務來做爲開始,並由以提交命令或者回滾命令來提交或者回滾事務做爲結束的一段代碼就是一個用戶定義的顯式事務。

3. 隱式事務

在隱式事務中,無需使用BEGIN TRANASACTION 來開啓事務,每一個SQL語句第一次執行就會開啓一個事務,直到用COMMIT [TRANSACTION]來提交或者ROLLBACK [TRANSACTION]來回滾結束事務。

在ORACLE、MYSQL和SQL SERVER中,這幾種模式的開啓和關閉方式都有着本身不一樣的命令,具體命令請參見《關係型數據庫事務詳解之三:事務運行模式》

3、事務的運行狀態

事務在執行過程當中有着不一樣的狀態:

1. 活動狀態

事務初始和執行時所處於的狀態。

2. 部分提交狀態

事務執行完最後一條語句,直到操做實際輸出所有從內存寫入到磁盤這一過程,處於部分提交狀態。

3. 提交狀態

事務對數據的更改所有寫入磁盤,並寫入相關事務日誌。事務就進入提交狀態。

4.失敗狀態

事務未正常執行完,事務就進入失敗狀態。這種狀態的事務必須回滾。

5. 終止狀態

事務進行了回滾,而且數據庫已經恢復到事務執行前的狀態。這個時候處於終止狀態。

4、事務的併發控制

數據庫容許多個事務能夠同時併發執行。當多個事務同時執行操做同一個數據,會形成如下併發問題:髒讀、不可重複讀和幻讀。

1. 髒讀 是指一個事務讀取到了另外一個事務還沒有提交的數據。

2. 不可重複讀 是指受到其餘事務更改數據的影響,一個事務屢次讀到的同一個數據的值不一致。

3.幻讀 是指由於受到其餘事務插入或者刪除操做的影響,一個事務讀到的兩次的數據記錄數目不同。

數據庫經過設置隔離級別來應對這幾種問題。事務的隔離級別分別4種,按級別從低到高依次是Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

Read Uncommited 就是一個事務在其餘事務尚未提交更改時,能夠讀取數據。這種級別,以上三種併發問題都會出現。

Read Committed 就是一個事務要等其餘事務提交後才能讀取數據。在這種隔離級別下有可能發生不可重複讀和幻讀。

Repeatable Read 就是在一個事務開始讀取數據時,再也不容許其餘事務有修改數據的操做。這種級別就不會發生不可重複讀,只有可能出現幻讀。

serializable 就是全部的事務都是串行執行的,一個事務執行完了,再接着執行其它的事務。這樣能夠解決以上說有併發問題,可是由於經過大量的加鎖來實現的,因此效率很低。

相關文章
相關標籤/搜索