更新語句執行過程大致與查詢過程相似
wal技術,write-ahead logging,先寫日誌再寫磁碟binlog(歸檔日誌)server層自己的日誌,binlog有兩種模式,statement 格式是記sql語句, row格式會記錄行的內容,記兩條,更新前和更新後都有。redo log(重做日誌)innodb引擎特有的日誌,擁有crash-safe能力(即使資料庫發生異常重啟,之前提交的記錄也不會丟失)。
兩階段提交:保證兩份日誌之間的邏輯一致(反證法)1. 引擎將行資料更新到記憶體,同時將更新操作記錄到redo log中,此時redo log處於prepare狀態。然後告知執行器執行完了,隨時可以提交事務。
2. 執行器生成這個操作的binlog,寫入磁碟
3. 執行器呼叫引擎的提交事務介面,引擎把redo log改成提交狀態commit,更新完成。
不同點 1. redo log是innodb特有的;binlog是server層實現的,所有引擎可以用。2. redo log是物理日誌,記錄「在某個資料頁做了什麼修改」;binlog是邏輯日誌,記錄語句的原始邏輯。
3. redo log是迴圈覆蓋寫的,空間固定會用完;binlog是追加寫,寫完乙個切換寫下乙個,不會覆蓋以前的日誌。
原文出處:
總結:理解兩種日誌的不同點和用途,兩階段提交
MySQL學習筆記(二)一條SQL更新語句
從乙個表的一條更新語句說起,下面是這個表的建立語句,這個表有乙個主鍵id和乙個整型欄位c mysql create table t id int primary key,c int 假如將id 2這一行的值加1 執行語句要先通過聯結器連線資料庫。在乙個表上更新的時候,跟這個表有關的查詢快取會失效。接...
一條SQL更新語句的執行過程
目錄如果執行這條更新語句資料庫是如何執行的呢?update student set name 小明 where studentid 1根據之前說過的sql語句查詢的流程來說,只要表上有資料更新,有關查詢的索引就會失效,接下來分析器會根據每個單詞識別知道這是update語句,優化器根據這個id獲取需要...
一條SQL更新語句是如何執行的
mysql create table t id int primary key,c int 如果要將id 2這一行的值加1,sql語句就會這麼寫 mysql update t set c c 1where id 2 執行語句前要先連線資料庫,這是聯結器的工作。在乙個表上有更新的時候,跟這個表有關的查...