Mysql InnoDB 事物學習

2021-09-12 15:51:39 字數 1792 閱讀 6802

原子性 atomicity

一致性 consistency

隔離性 isolation

永續性 durability

扁平事物

帶有儲存點的扁平事物

鏈事物 巢狀事務

分布式事務

redo與undo redo

redo:保證事物的原子性、永續性,物理日誌,基本上是順序寫

undo:保證事物的一致性,邏輯日誌,undo會產生redo,用於事物回滾和mvcc,隨機讀寫

redo log buffer

redo log file

force log at commit機制實現事物的永續性

redo log buffer -> 檔案系統快取 -> (fsync) 磁碟檔案

innodb_flush_log_at_trx_commit

0:master thread完成寫入磁碟

1:預設,每次事物提交必須fsync

2:寫入檔案系統快取,不執行fsync

log block

512 位元組和磁碟山區大小一致,保證日誌寫入是原子性的,不需要doublewrite ?技術

分為 512 - 12 -8 = 492

重做日誌頭:12 位元組

重做日誌內容:

重做日誌尾:8位元組

log_block_har_no【4位元組】:log block在 log buffer的位置

log_block_har_data_len【2位元組】:log block占用大小

log_block_first_rec_group【2位元組】:第乙個日誌所在的偏移量

log_block_checkpoint_no【4位元組】:最後被寫入時的檢查點第4位元組的值 ??

log grooup

多個多個重做日誌檔案組成

redo log file

重做日誌格式

redo_log_type:重做日誌的型別

space:表空間的id

page_no:頁的偏移量

lsn(log sequence number)

8位元組,單調遞增

含義:重做日誌寫入總量

checkpoint的位置

頁的版本

undo segment:共享表空間內

(128個)rollback segment > (1024個)undo segment ,事物併發限制在128*1024

undo log 格式

insert undo log

update undo log

purge

group commitread uncommit:使用查詢語句不會加鎖,可能會讀到未提交的行(dirty read)

read commit:只對記錄加記錄鎖,而不會在記錄之間加間隙鎖,所以允許新的記錄插入到被鎖定記錄的附近,所以再多次使用查詢語句時,可能得到不同的結果(non-repeatable read)epeatable read:多次讀取同一範圍的資料會返回第一次查詢的快照,不會返回不同的資料行,但是可能發生幻讀(phantom read);

serializable:innodb 隱式地將全部的查詢語句加上共享鎖,解決了幻讀的問題;

髒讀:在乙個事務中,讀取了其他事務未提交的資料

不可重複讀:在乙個事務中,同一行記錄被訪問了兩次卻得到了不同的結果。

幻讀:在乙個事務中,同乙個範圍內的記錄被讀取時,其他事務向這個範圍新增了新的記錄。

不可重複讀的原因就是,在 read commited 的隔離級別下,儲存引擎不會在查詢記錄時新增行鎖,鎖定 id = 3 這條記錄。

xa

Mysql InnoDB 事物學習

原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 扁平事物 帶有儲存點的扁平事物 鏈事物 巢狀事務 分布式事務 redo與undo redo redo 保證事物的原子性 永續性,物理日誌,基本上是順序寫 undo 保證事物的一致性,...

Mysql InnoDB 事物學習

原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 扁平事物 帶有儲存點的扁平事物 鏈事物 巢狀事務 分布式事務 redo與undo redo redo 保證事物的原子性 永續性,物理日誌,基本上是順序寫 undo 保證事物的一致性,...

(mysql)Innodb引擎行鎖學習

mysql常用引擎有myisam和innodb,而innodb是mysql預設的引擎。myisam不支援行鎖,而innodb支援行鎖和表鎖 innodb的行鎖是加在響應的索引上的,即sql語句中有索引,如果沒有就是全表掃瞄,即表鎖 表鎖 不會死鎖,索衝突機率高,併發低 行鎖 會發生死索,索衝突機率低...