Mysql innodb引擎(三) 事務

雲逸_發表於2018-09-05

1.事務特性:(ACID)

A tomicity:原子性—是指整個事務是一個整體,不可分割的最小工作單位。
C onsistency:一致性—指事務將資料從一種狀態轉換成下一種一致的狀態。即事務執行前和事務執行後不能對資料庫本身的其他約束和限制產生不一致的結果。比如導致唯一約束丟失等。
I solation:隔離性—要求每個事務的物件對其他事務的操作物件能互相分離,互不影響。即是事務提交前對其他事務都不可見。
D urability:永續性--資料一旦提交,結果就是永久性的。並不應為當機等情況丟失。

2.事務的分類:

2.1扁平事務:(flat transaction)

  • 所有操作處於同一層次的事務
  • 是程式成為原子操作的基本組成模組
  • 雖然簡單,但是是在實際場景中使用最頻繁的事務型別

2.2帶儲存點的扁平事務(flat transaction with save point)

  • 在扁平事務的中間還帶有儲存點,讓系統記住事務當前狀態,以便發生錯誤的時候可以回到儲存點當時的狀態
  • 扁平事務就是在結束位置隱藏的設有一個儲存點
  • 儲存點事務的儲存點是易失的而非持久的,如果系統發生異常,當恢復時事務需要從頭執行
  • 提交後不釋放所持有的鎖

2.3鏈式事務(chained transaction)

  • 儲存點扁平事務的一種變種
  • 在提交一個事務時,釋放不需要的資料物件,將必要的處理上下文隱式的傳遞給下一個要開始的事務。
  • 提交事務和開始下一個事務將合併為一個原子操作
  • 鏈式事務回滾只能回覆最近一個儲存點
  • 鏈式事務提交將會釋放所持有的鎖

2.4巢狀事務(Nested Transaction)

  • innodb 不支援
  • 層次結構框架,由若干事務組成的一棵樹,子樹既可以是巢狀事務,也可以是子事務
  • 由一個頂層事務控制著各個層次的事務
  • 頂層以下的事務被稱為子事務,子事務控制著每一個區域性變換
  • 葉子節點的事務都是扁平事務
  • 處於根節點的是頂層事務,事務的前驅叫父事務,下一層是兒子事務
  • 子事務可以回滾也可以提交,但是不會立馬生效,除非父事務已經提交。因此整個事務只能在頂層事務提交後生效
  • 樹種任意一個事務回滾都會引起他的所有子事務回滾,故子事務只有 ACI 特性,不具有持久特性
  • 不同的子事務可以持有不同的鎖。但是巢狀事務上下層之間是可以選擇是否傳遞自己持有的鎖

2.5分散式事務(distributed transactions)

  • 即分散式節點之間保證 ACID 特性的事務
  • 允許多個獨立的事務資源,參與到一個全域性事務中
  • 所有參與的事務要麼都提交要麼都回滾

3事務隔離級別:

隔離級別越低,事務請求的鎖越少或保持鎖的時間就越短 根據高人研究,SERIALIZABLE 級別的效率並不比 READ UNCOMMITED 低,甚至有可能更優。

3.1READ UNCOMMITED

  • 被成為瀏覽訪問,由於沒有任何鎖限制。所以髒讀,幻讀,丟失更新都存在。

3.2READ COMMITED

  • 因為 innodb 在這個級別沒有使用 grap lock ,所以幻讀情況是存在的。

3.3REPETABLE READ

  • innodb預設事務
  • innodb 因為使用Next-key lock 避免了幻讀,所以在這個級別已經實現了 SQL 規範的 SERIALIZABLE 事務隔離級別的要求

3.4SERIALIZABLE

  • SQL SQL2 標準的預設事務級別
  • 在這個級別 innodb 會在每句SELECT後面預設加上LOCK IN SHARE MODE開啟共享鎖
  • 由於 innodb 在 REPEATABLE READ 級別就實現了避免幻讀,所以 SERIALIZABLE 級別通常用在分散式事務情境下

4.innodb 的分散式事務

  • 通過 XA 事務來實現分散式事務
  • 使用時必須使用 SERIALIZABLE 事務隔離級別
  • XA 事務允許不同資料庫型別之間的分散式事務,比如 SqlServer 與 innodb 搭配使用

4.1XA 事務

  • 由一個或者多個資源管理器、一個事務管理器以及一個應用程式組成

4.1.1資源管理器:

  • 提供訪問事務資源的方法
  • 通常一個資料庫就是一個資源管理器

4.1.2事務管理器:

  • 協調參與全域性事務的各個事務
  • 需要和參與到全域性事務的所有資源管理器通訊

4.1.3應用程式:

  • 定義事務的邊界
  • 指定全域性事務中的操作

4.1.3XA使用的兩段式提交流程:

  • 所有全域性事務節點開始準備,並告訴事務管理器準備提交了
  • 事務管理器再告訴節點是回滾還是提交
  • 如果任何一個節點不能提交,則全部回滾

Mysql innodb引擎(二)鎖

Mysql innodb引擎(一)緩衝和索引

相關文章