數據庫事務介紹

1、事務的介紹數據庫

事務是併發控制單位,是用戶定義的一個操做序列,這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。併發

 

事務一般以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。線程

 

2、事務的特徵事務

  • 原子性:事務是數據庫的邏輯工做單位,事務中的操做要麼都作,要麼都不作。it

 

  • 一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。table

 

  • 隔離性:一個事務的執行不能干擾其餘的事務。即一個事務內部的操做及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。class

 

  • 持久性:一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操做或故障不該該對其執行結果有任何影響。效率

 

3、併發下的問題序列化

當多個線程都開啓事務操做數據庫中的數據時,數據庫系統要能進行隔離操做,以保證各個線程獲取數據的準確性。在介紹數據庫提供的各類隔離級別以前,咱們先看看若是不考慮事務的隔離性,會發生的幾種問題:數據

 

髒讀

        髒讀是指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。

        例如:某個事務已更新一份數據,另外一個事務在此時讀取了同一份數據,因爲某些緣由,前一個回滾了操做,則後一個事務所讀取的數據就會是不正確的髒數據。

 

不可重複讀

        不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。

        例如:事務A在讀取某一數據,而事務B立馬修改了這個數據而且提交事務給數據庫,事務A再次讀取該數據就獲得了不一樣的結果,發生了不可重複讀。

 

幻讀

        在一個事務的兩次查詢中數據筆數不一致,是事務非獨立執行時發生的一種現象。

        例如:有一個事務查詢了幾列數據,而另外一個事務卻在此時插入了新的幾列數據。先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

 

對比理解

  • 不可重複讀和髒讀的區別是:髒讀是某一事務讀取了另外一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據(讀取前一事務提交的數據一些場景下會出現問題)。

 

  • 幻讀和不可重複讀都是讀取了另外一條已經提交的事務,所不一樣的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據總體。

 

4、事務隔離級別

  • Read uncommit(讀未提交) 

  • Read commit(讀已提交) 

  • Repeatable read(可重複讀) 

  • Serializable(序列化) 

 

讀未提交

        在該隔離級別,全部事務均可以看到其它事務未提交的內容數據。此隔離級別沒有解決任何併發問題,不經常使用。

 

讀已提交

        在該隔離級別,一個事務只能讀取其它事務已經提交的內容數據。此隔離級別解決了髒讀,但沒有解決不可重複讀和幻讀,是ORACLE的默認隔離級別。

 

可重複讀

        在該隔離級別,能保證一個事務之間的多個實例在併發下能讀取同一數據。此隔離級別解決了髒讀和不可重複讀,是MYSQL的默認級別。

 

序列化

        這是最高的隔離級別,在此隔離級別,事務事務之間只能順序執行,使之沒有任何衝突。序列化解決了髒讀,不可重複讀和幻讀。

 

隔離級別越高,越能保證數據的完整性和一致性,可是對併發的效率就越低。所以並非隔離級別越高越好,應根據具體的業務場景選用合適的事務隔離級別。

相關文章
相關標籤/搜索