MySQL 事務隔離級別

2021-10-24 09:16:09 字數 1419 閱讀 3093

檢視 mysql 事務隔離級別

mvcc 只在 可重複讀和讀提交兩個隔離級別下工作。

mvcc 的實現,是通過儲存資料在某個時間點的快照來實現的,也就是說,不管需要自行多長時間,每個事務看到的資料都是一致的。

innodb 的 mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,乙個儲存了行的建立時間,乙個儲存了行的過期時間(或刪除時間)。當然儲存的並不是實際的時間值,而是系統版本號。每開始乙個新的事務,系統版本號都會自動遞增,事務開始時刻的系統版本號回做為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。

在可重複讀隔離級別下,mvcc 具體操作流程:

insert:innodb 為新插入的每一行儲存當前系統版本號作為行版本號

delete:innodb 為刪除的每一行儲存當前系統版本號作為行刪除標識

update:innodb 為插入一行記錄(回滾段的一條回滾記錄),儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行作為行刪除標識(重要)

同一條記錄在系統中可以存在多個版本,就是資料庫的多版本併發控制(mvcc)

回滾日誌的刪除時機

系統會判斷,當沒有事務再需要用到回滾日誌時,回滾日誌會被刪除,也就是說,當系統裡沒有事務的系統版本號小於這個回滾日誌的系統版本號時,系統會刪除回滾日誌。

顯示啟動事務語句,begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback

set autocommit = 0,這個命令會將這個執行緒的自動提交關掉。意味著如果你只執行乙個 select 語句,這個事務就啟動了,而且並不會自動提交。這個事務持續存在直到你主動執行 commit 或 rollback 語句,或者斷開連線。

建議總是使用 set autocommit = 1,通過顯示語句的方式來啟動事務,避免意外的長事務

show variables like

'autocommit'

可以在 information_schema 庫的 innodb_trx 這個表中查詢長事務,比如下面這個語句,用於查詢持續時間超過 60s 的事務。

select

*from information_schema.innodb_trx where time_to_sec(timediff(

now(

),trx_started)

)>

60

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...