MySQL InnoDB儲存引擎 之 事務

2021-08-28 10:01:23 字數 1457 閱讀 3855

1 事務特性

innodb的事務完全符合acid特性:

原子性:事務包含的所有操作要麼全部成功,要麼全部失敗回滾;成功必須要完全應用到資料庫,失敗則不能對資料庫產生影響;

一致性:事務執行前和執行後必須處於一致性狀態;

隔離性:當多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不被其他事務的操作所干擾,多個併發事務之間要相互隔離;

永續性:乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便在資料庫系統遇到故障的情況下也不會丟失事物的操作。

2 事務實現

2.1 redo

innodb儲存引擎中,事務日誌通過重做(redo)日誌檔案和innodb儲存引擎的日誌緩衝(innodb log buffer)來實現。當開始乙個事務時,會記錄事務的乙個lsn(log sequence number,日誌序列號);當事務執行時,回望innodb儲存引擎的日誌緩衝裡插入事務日誌;當事務提交時,必須把innodb儲存引擎的日誌緩衝寫入磁碟(預設的實現,即innodb_flush_log_at_trx_commit=1)。也就是在寫資料前,需先寫日,稱為預寫日誌方式(write-ahead logging,wal)。

2.2 undo

undo和redo正好相反,對於資料庫進行修改時,資料庫不會產生redo,而且還會產生一定量的undo,即使執行的事務或語句由於某種原因失敗了,或者想rollback時,可以利用undo資訊將資料回滾到修改之前的樣子。

3 事務控制語句

4 事務隔離級別

事務級別帶來的一些問題

髒讀:(針對未提交的資料)乙個事務在更新一條記錄,未提交前,第二個事務讀到了第乙個事務更新後的記錄,那麼第二個事務就讀到了髒資料,會產生對第乙個未提交資料的依賴。一旦第乙個事務回滾,那麼第二個事務讀到的資料,將是錯誤的髒資料。

不可重複讀:(讀取資料本身的對比)乙個事務在讀取某些資料後的一段時間後,再次讀取這個資料,發現其讀取出來的資料內容已經發生了改變,就是不可重複讀。

幻讀:(讀取結果集條數的對比)乙個事務按相同的查詢條件查詢之前檢索過的資料,確發現檢索出來的結果集條數變多或者減少(由其他事務插入、刪除的),類似產生幻覺。

ps:在mysql5.7下試驗,預設級別為repeatable read,該級別把上面三個問題都解決了,其中幻讀主要採用mvcc多版本併發控制。

最後ps:

應用程式中,最好的做法是吧事務start transaction、commit、rollback操作交給程式端來完成,而不是儲存過程內完成,因為程式端可以捕獲出錯的異常進行相應的處理。

mysql InnoDB儲存引擎

innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...

Mysql Innodb儲存引擎

鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...

MYSQL INNODB 儲存引擎

innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...