MySQL讀書筆記 事務日誌,MySQL中的事務

2021-07-14 21:53:08 字數 1643 閱讀 3464

事務日誌,可以幫助提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域內的順序i/o,而不是隨機i/o,所以快很多。事務日誌持久以後,記憶體中被修改的資料在後台可以慢慢地刷回到磁碟。此方式稱之為,預寫式日誌,修改資料需要寫兩次磁碟

如果資料的修改已經紀錄到事務日誌中,但資料本身還沒有寫回磁碟,此時系統崩潰,儲存引擎在重啟時,能夠自動恢復這部分修改的資料(具體恢復方式則視儲存引擎而定)。

mysql提供了兩種事務儲存引擎:innodb和ndb cluster。另外還有一些第三方的儲存引擎(例如,xtradb)也支援事務。

(1)當autocommit=0時,所有的查詢都是在乙個事務中,直到顯示地執行commit,或者rollback時,該事務結束。

(2)修改autocommit對非事務型的表(例如,myisam),不會有任何影響,相當於一直處於autocommit啟用的模式。

(3)一些命令,在執行前會強制執行commit提交當前的事務。例如,使用ddl(資料定義語言)。

(4)mysql可以通過執行set transaction isolation level命令來設定隔離級別,新的隔離級別會在下乙個事務開始時生效。

# 檢視autocommit狀態和啟用

show variables like

'autocommit';

set autocommit = 1;

# 設定下乙個會話的隔離級別為read commited

settransaction

isolation

level

read commited;

mysql伺服器層不管理事務,事務是由下層的儲存引擎實現的。所以,在同乙個事務中,使用多種儲存引擎是不可靠的。

(1)為每張表選擇合適的儲存引擎非常重要。

(2)在非事務型表上執行事務相關操作,mysql通常不會發出提醒,也不會報錯(即,大多數情況下,對非事務型表的操作都不會有提示)。

innodb採用的是兩階段鎖定協議(two-phase locking protocol)。

隱式鎖定,innodb會根據隔離級別在需要的時候自動加鎖,並在執行commit或rollback時釋放。

顯式鎖定,innodb也支援通過特定的語句進行顯式鎖定,這些語句不屬於sql規範。

select ... lock

in share mode;

select ... for

update;

mysql也支援lock tablesunlock tables語句,這是在伺服器層實現的,和儲存引擎無關。它們有自己的用途,但並不能代替事務處理,如果應用需要用到事務,還是應該選擇事務型儲存引擎。

思考:innodb的行級鎖比myisam中使用lock tables開銷要小。

MySQL讀書筆記 事務的ACID及實現

首先,非常明確的是,innodb實現事務主要通過redo 日誌。什麼是redo 日誌 redo 日誌 即重做日誌,主要是為了在資料庫奔潰時,保證下次重啟資料庫時,恢復奔潰之前已提交的事務。以保證資料的完整性。redo 日誌組成 redo日誌緩衝 和 redo日誌 redo 日誌實現原理 在事務提交時...

mysql 筆記 事務

一 問題讀取 1.髒讀 dirty read 事務1更新了某一條記錄,但未提交 事務2讀取到新的未提交記錄 事務1回滾。2.不可重複讀取 nonrepeatable read 不可重複讀,是指在資料庫訪問中,乙個 事務範圍內兩個相同的查詢卻返回了不同資料。例子 事務1讀取某一條記錄 事務2修改事務1...

mysql筆記 事務

寫日誌為什麼比直接寫磁碟要快?使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域內的順序i o,而不是隨機i o,所以快很多。事務日誌持久以後,...