淺談ACID

ACID

當咱們學習數據庫事務的時候,咱們就知道了事務有4個特性,分別是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。數據庫

原子性

要麼所有成功,要麼所有失敗,只要有一個失敗,已經成功的都要回滾。
好比A帳號給B帳號轉帳100塊錢,正常狀況是A扣款100塊,而後B帳號增長100塊。若是A這邊扣款成功,B增長100塊的時候失敗了,這個時候,A扣款的操做就要回滾,也就是A也不扣款,B也沒新增。併發

一致性

wikipedia包含這類描述學習

Any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof.

數據的寫入,必須符合咱們的定義的規則。好比咱們定義了金額是數值型,那麼久不能傳入字符串。咱們定義了金額不能小於0,那就不能賦值爲負數(這個是咱們程序定義的)。spa

隔離性

指併發中的事務,即使操做共同的數據時,每一個是事務是相互隔離的,相互不能影響的,每一個事務都有本身完整的事務空間。
隔離級別從低到高:3d

Read Uncommitted(讀未提交):

image.png

  1. 事務1更新id爲1的name爲張三
  2. 事務2讀取id爲1的name,此時讀取的值爲張三
  3. 事務1更新id爲1的name爲李四
  4. 事務2讀取id爲1的name,此時讀取的值爲李四

在事務1還沒提交的時候,事務2能夠讀取到事務1更改的值。blog

Read Committed(讀已提交):

image.png

  1. 事務2讀取id爲1的name,假設讀取的初始值爲李四
  2. 事務1更新id爲1的name爲張三
  3. 事務2讀取id爲1的name,讀取值爲李四(這個跟上面不同,此時事務1還沒提交,是看不到修改後的值)
  4. 事務1提交
  5. 事務2讀取id爲1的name,此時讀取的值爲張三

上面例子能夠看出,在同一個事務中,事務2讀取的值是不同的。事務

Repeated Read(重複讀):

圖跟上面同樣ip

  1. 事務2讀取id爲1的name,假設讀取的初始值爲李四
  2. 事務1更新id爲1的name爲張三
  3. 事務2讀取id爲1的name,讀取值爲李四(這個跟上面不同,此時事務1還沒提交,是看不到修改後的值)
  4. 事務1提交
  5. 事務2讀取id爲1的name,此時讀取的值爲李四(這個與上面不同的地方)

Serialization(串行化):

image.png

  1. 事務2讀取id爲1的name,假設讀取的初始值爲李四
  2. 事務1更新id爲1的name爲張三,被阻塞了,等user表的id爲1的事務提交,這個時候,id爲1的這行被鎖住了。
  3. 事務2執行範圍的查詢語句
  4. 事務1修改或插入數據,都被阻塞,這個時候,user表都鎖住了。

串行化,就是全部的事務串行的執行,一個事務執行才,才能執行後面一個。ci

讀現象

髒讀

當一個事務讀取到另外一個事務未提交的數據,就可能發生髒讀。
參見讀未提交的例子。字符串

不可重複讀

在一次事務中,查詢屢次的結果不是一致的,這代表發生不可重複讀。
參見讀已提交的例子。

幻影讀

在一次事務中,查詢屢次的結果集不是一致的。
image.png

  1. 事務2查詢id在1到10直接的名稱,假設有5個
  2. 事務1插入id爲9的數據
  3. 事務1提交
  4. 事務2查詢id在1到10直接的名稱,此時有6個
隔離級別和讀現象的關係

image.png

持久性

指事務一旦提交,就永久保留下來。系統崩潰、機器宕機,只要重啓數據庫,就能夠讀取到數據。

相關文章
相關標籤/搜索