1. 程式人生 > >mysql事務介紹及原理

mysql事務介紹及原理

1 為什麼要事務

  事務是一組不可被分割執行的SQL語句集合,如果有必要,可以撤銷。銀行轉賬是經典的解釋事務的例子。使用者A給使用者B轉賬5000元主要步驟可以概括為如下兩步。
  第一,賬戶A賬戶減去5000元;
  第二,賬戶B賬戶增加5000元;
  這兩步要麼成功,要麼全不成功,否則都會導致資料不一致。這就可以用到事務來保證,如果是不同銀行之間的轉賬還需要用到分散式事務。

2 事務的性質

  事務的機制通常被概括為“ACID”原則即原子性(A)、穩定性(C)、隔離性(I)和永續性(D)。
  原子性:構成事務的的所有操作必須是一個邏輯單元,要麼全部執行,要麼全部不執行。
  穩定性:資料庫在事務執行前後狀態都必須是穩定的。
  隔離性:事務之間不會相互影響。
  永續性:事務執行成功後必須全部寫入磁碟。

3 事務隔離性實現原理

  資料庫事務會導致髒讀、不可重複讀和幻影讀等問題。
  髒讀:事務還沒提交,他的修改已經被其他事務看到。
  不可重複讀:同一事務中兩個相同SQL讀取的內容可能不同。兩次讀取之間其他事務提交了修改可能會造成讀取資料不一致。
  幻影資料:同一個事務突然發現他以前沒發現的資料。和不可重複讀很類似,不過修改資料改成增加資料。
針對可能的問題,InnoDB提供了四種不同級別的機制保證資料隔離性。

  事務的隔離用是通過鎖機制實現的,不同於MyISAM使用表級別的鎖,InnoDB採用更細粒度的行級別鎖,提高了資料表的效能。InnoDB的鎖通過鎖定索引來實現,如果查詢條件中有主鍵則鎖定主鍵,如果有索引則先鎖定對應索引然後再鎖定對應的主鍵(可能造成死鎖),如果連索引都沒有則會鎖定整個資料表。