MySQL事務(一)認識事務

簡單來講,事務就是要保證一組數據庫操做,要麼所有完成,要麼所有失敗。mysql

爲何要有事務

數據庫中的數據是共享資源,所以數據庫系統一般要支持多個用戶的或不一樣應用程序的訪問,會出現併發存取數據的現象。面試

數據庫系統必須對這種併發操做提供一種相應的處理機制來保證,訪問彼此之間不受任何干擾,從而保證數據庫的正確性不受到破壞,這種處理機制稱爲「併發控制」。其中事務就是爲了保證數據的一致性而產生的一種概念和手段。sql

事務特性

爲了保證數據庫的正確性與一致性,事務要具備4個特性:數據庫

  • 原子性(atomicity):一個事務應該是一個不可分割的工做單位,事務中包括的操做要麼都成功,要麼都不成功。
  • 一致性(consistency):事務必須是使數據庫從一個一致性狀態變成另外一個一致性狀態。一致性與原子性是密切相關的。
  • 隔離性(isolation):一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據在事務未提交前對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相影響。
  • 持久性(durability):一個事務一旦成功提交,它對數據庫中數據的改變就應該是永久性的。

併發事務存在的問題

若是不考慮事務的隔離性,會發生如下幾種問題:併發

髒讀

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

不可重複讀

不可重複讀是指在對於數據庫中的某條數據,一個事務範圍內屢次查詢返回不一樣的數據值(這裏的不一樣是指某一條或多條數據的內容先後不一致,但數據條數相同)。3d

不可重複讀和髒讀的區別是:code

  • 髒讀是某一事務讀取了另外一個事務未提交的髒數據。
  • 不可重複讀是讀取了其餘事務提交的數據。

幻讀

幻讀指的是一個事務在先後兩次查詢同一個範圍的時候,後一次查詢看到了前一次查詢沒有看到的行。htm

事務隔離級別

  • 讀未提交(read uncommitted):一個事務還沒提交時,它作的變動就能被別的事務看到。
  • 讀提交(read committed):一個事務提交以後,它作的變動纔會被其餘事務看到。
  • 可重複讀(repeatable read):一個事務執行過程當中看到的數據,老是跟這個事務在啓動時看到的數據是一致的。固然在可重複讀隔離級別下,未提交變動對其餘事務也是不可見的。
  • 串行化(serializable ):顧名思義是對於同一行記錄,「寫」會加「寫鎖」,「讀」會加「讀鎖」。當出現讀寫鎖衝突的時候,後訪問的事務必須等前一個事務執行完成,才能繼續執行。

下面用一個例子來講明這四種隔離級別:blog

mysql> create table T(c int) engine=InnoDB;
mysql> insert into T(c) values(1);

假設表T只有一條記錄,值是1。咱們來看看在不一樣的隔離級別下,事務A會有哪些不一樣的返回結果,也就是圖裏面T四、T六、T8的返回值分別是什麼。

  • 若隔離級別是「讀未提交」, 則T4的值就是2。這時候事務B雖然尚未提交,可是結果已經被A看到了。所以,T六、T8也都是2。
  • 若隔離級別是「讀提交」,則T4是1,T6的值是2。事務B的更新在提交後才能被A看到。因此, T8的值也是2。
  • 若隔離級別是「可重複讀」,則T四、T6是1,T8是2。之因此T6仍是1,遵循的就是這個要求:事務在執行期間看到的數據先後必須是一致的。
  • 若隔離級別是「串行化」,則在事務B執行「將1改爲2」的時候,會被鎖住。直到事務A提交後,事務B才能夠繼續執行。因此從A的角度看, T四、T6值是1,T8的值是2。

參數資料

相關文章
相關標籤/搜索