mysql事務介紹及原理
阿新 • • 發佈:2019-02-02
1 為什麼要事務
事務是一組不可被分割執行的SQL語句集合,如果有必要,可以撤銷。銀行轉賬是經典的解釋事務的例子。使用者A給使用者B轉賬5000元主要步驟可以概括為如下兩步。
第一,賬戶A賬戶減去5000元;
第二,賬戶B賬戶增加5000元;
這兩步要麼成功,要麼全不成功,否則都會導致資料不一致。這就可以用到事務來保證,如果是不同銀行之間的轉賬還需要用到分散式事務。
2 事務的性質
事務的機制通常被概括為“ACID”原則即原子性(A)、穩定性(C)、隔離性(I)和永續性(D)。
原子性:構成事務的的所有操作必須是一個邏輯單元,要麼全部執行,要麼全部不執行。
穩定性:資料庫在事務執行前後狀態都必須是穩定的。
隔離性:事務之間不會相互影響。
永續性:事務執行成功後必須全部寫入磁碟。
3 事務隔離性實現原理
資料庫事務會導致髒讀、不可重複讀和幻影讀等問題。
髒讀:事務還沒提交,他的修改已經被其他事務看到。
不可重複讀:同一事務中兩個相同SQL讀取的內容可能不同。兩次讀取之間其他事務提交了修改可能會造成讀取資料不一致。
幻影資料:同一個事務突然發現他以前沒發現的資料。和不可重複讀很類似,不過修改資料改成增加資料。
針對可能的問題,InnoDB提供了四種不同級別的機制保證資料隔離性。
事務的隔離用是通過鎖機制實現的,不同於MyISAM使用表級別的鎖,InnoDB採用更細粒度的行級別鎖,提高了資料表的效能。InnoDB的鎖通過鎖定索引來實現,如果查詢條件中有主鍵則鎖定主鍵,如果有索引則先鎖定對應索引然後再鎖定對應的主鍵(可能造成死鎖),如果連索引都沒有則會鎖定整個資料表。