事務會把資料庫從一種一致狀態轉換為另一種一致狀態。
一致性隔離性
永續性帶有儲存點的扁平事務
鏈事務巢狀事務
分布式事務
事務的隔離性由鎖來實現。而原子性、一致性、永續性通過資料庫的redo log和undo log來完成。
redo log稱為重做日誌,用來保證事務的原子性和永續性。
undo log用來保證事務的一致性。
redo恢復提交事務修改的頁操作,而undo回滾行記錄到某個特定版本。redo通常是物理日誌,記錄的是頁的物理修改操作,undo是邏輯日誌,根據每行記錄進行記錄。
重做日誌用來實現事務的永續性,其有兩部分組成:
innodb是事務的儲存引擎,其通過force log at commit機制實現事務的永續性,即當事務提交(commit)時,必須先將該事務的所有日誌寫入到重做日誌檔案進行持久化,待事務的commit操作完成才算完成。
特點: 重做日誌記錄了事務的行為,可以很好地通過其對頁進行「重做」操作。但是事務有時候還需要進行回滾操作,這時就需要undo。
因此在對資料庫進行修改時,innodb儲存引擎不但會產生redo,還會產生一定量的undo。如果使用者執行的事務或者語句由於某種原因失敗了,又或者使用者用一條rollback語句請求回滾,就可以利用這些undo資訊將資料回滾到修改之前的樣子。
除了回滾,undo log另外乙個作用就是mvcc。當使用者讀取一行記錄的時候,若該記錄已經被其他事務所占用,當前事務可以通過undo讀取之前的行版本資訊,以此實現非鎖定讀取。
事務a和b的時序關係如下圖,那麼在b提交之後,a能否看到b事務修改的值呢?
答案是不同隔離級別下快照資料不同,根據可見性演算法來判斷。
在innodb引擎中,每一行記錄上都會包含幾個使用者不可見的字段,如上圖所示。隱藏主鍵指的是如果在建立表的時候沒有主鍵索引,那麼就根據非空的列建立索引,如果沒有非空的列,那麼innodb通過隱藏的row_id來建立乙個隱藏的主鍵索引。
回滾指標
假設現在有一行資料,事務1新增進來的,其結構如下。
假設現在來了乙個事務2,對上面的行執行修改操作,整個過程如下圖
再來乙個事務3
問題:如果現在有了事務4,那麼事務4讀取到的是哪乙個版本的資料?
答案:在上面的事務123演示的過程中,並沒有提到事務是否提交,事務開啟的時機。那麼事務4讀取哪個版本資料,一定有相應的規則。
事務在進行快照讀的時候會產生讀檢視
案例演示
問當前快照讀能否讀取到剛剛修改的記錄值
根據下面的可見性演算法分析,可以得出結論
結果分析
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 的資料庫系統,必需要具有這四種特性,否...