MySQL 資料庫事務深入分析

2021-09-26 09:49:56 字數 1969 閱讀 1491

推薦閱讀:吊打面試官!mysql靈魂100問,你能答出多少?

只有innodb引擎支援事務,下邊的內容均以innodb引擎為預設條件

乙個事務讀取了另乙個事務未提交的資料

乙個事務對同一資料的讀取結果前後不一致。兩次讀取中間被其他事務修改了

幻讀是指事務讀取某個範圍的資料時,因為其他事務的操作導致前後兩次讀取的結果不一致。幻讀和不可重複讀的區別在於,不可重複讀是針對確定的某一行資料而言,而幻讀是針對不確定的多行資料。因而幻讀通常出現在帶有查詢條件的範圍查詢中

可能產生髒讀、不可重複讀、幻讀

避免了髒讀,可能產生不可重複讀、幻讀

避免了髒讀,不可重複讀。通過區間鎖技術避免了幻讀

序列化可以避免所有可能出現的併發異常,但是會極大的降低系統的併發處理能力

undo日誌用於存放資料修改被修改前的值

undo log中分為兩種型別,一種是 insert_undo(insert操作),記錄插入的唯一鍵值;

一種是 update_undo(包含update及delete操作),記錄修改的唯一鍵值以及old column記錄。

mysql會將乙個事務中的所有sq先l記錄到redo log中,然後再將記錄從redo log同步到資料檔案中

它可以帶來這些好處:

用於資料庫主從複製的記錄,是二進位制格式。在事務提交之後進行乙個磁碟寫入。

這裡注意下redo log 跟binary log 的區別,redo log 是儲存引擎層產生的,而binary log是資料庫層產生的。假設乙個大事務,對tba做10萬行的記錄插入,在這個過程中,一直不斷的往redo log順序記錄,而binary log不會記錄,直到這個事務提交,才會一次寫入到binary log檔案中

1、預設情況下,開啟事務自動提交功能。每執行乙個sql,都會對應乙個事務的提交

2、spring會將底層連線的自動提交特性設定為false。使用手動提交

事務中的所有操作作為乙個整體像原子一樣不可分割,要麼全部成功,要麼全部失敗。

事務的執行結果必須使資料庫從乙個一致性狀態到另乙個一致性狀態。一致性狀態是指:1.系統的狀態滿足資料的完整性約束(主碼,參照完整性,check約束等) 2.系統的狀態反應資料庫本應描述的現實世界的真實狀態,比如轉賬前後兩個賬戶的金額總和應該保持不變。

併發執行的事務不會相互影響,其對資料庫的影響和它們序列執行時一樣。比如多個使用者同時往乙個賬戶轉賬,最後賬戶的結果應該和他們按先後次序轉賬的結果一樣。

事務一旦提交,其對資料庫的更新就是持久的。任何事務或系統故障都不會導致資料丟失。

讀取的是快照版本,也就是歷史版本。普通的select就是快照讀

讀取的是最新版本。update、delete、insert、select ... lock in share mode、select ... for update是當前讀。

在乙個事務中,標準的select語句是不會加鎖,但是有兩種情況例外。select ... lock in share mode 和 select ... for update。

select ... lock in share mode
給記錄假設共享鎖,這樣一來的話,其它事務只能讀不能修改,直到當前事務提交

select ... for update
給索引記錄加鎖,這種情況下跟update的加鎖情況是一樣的

consistent read(一致性讀),innodb用多版本來提供查詢資料庫在某個時間點的快照。如果隔離級別是repeatable read,那麼在同乙個事務中的所有一致性讀都讀的是事務中第乙個這樣的讀讀到的快照;如果是read committed,那麼乙個事務中的每乙個一致性讀都會讀到它自己重新整理的快照版本。consistent read(一致性讀)是read committed和repeatable read隔離級別下普通select語句預設的模式。一致性讀不會給它所訪問的表加任何形式的鎖,因此其它事務可以同時併發的修改它們。

資料庫事務深入分析

1 原子性 atomic 2 一致性 consistent 一致性要求事務執行完成後,將資料庫從乙個狀態轉變為另乙個狀態,他是一種以一致性規則為基礎的邏輯屬性,例如在轉賬操作中,個賬戶金額必須平衡 3 隔離性 insulation 乙個事務的執行不能被其他事務所干擾。即乙個事務內部的操作及使用的資料...

深入分析資料庫儲存引擎

儲存引擎 1 概述 1 表處理器 mysql提過了乙個抽象層,允許不同的儲存引擎使用相同的api對錶進行訪問,這一介面稱之為表處理器,該介面通過handler的抽象類來實現,該處理器提供了一些課實現基本儲存的方法,如開啟關閉表,按照鍵進行檢索,儲存記錄及刪除記錄,2 儲存引擎 1 最近引進儲存引擎這...

深入分析列式與行式資料庫

定義 列式儲存 column based 是相對於傳統關係型資料庫的行式儲存 row based 來說的。簡單來說兩者的區別就是如何組織表。將表放入儲存系統中有兩種方法,而我們絕大部分是採用行儲存的。行儲存法是將各行放入連續的物理位置,這很像傳統的記錄和檔案系統。列儲存法是將資料按照列儲存到資料庫中...