中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么深入分析MySQL數據庫事務

發布時間:2021-10-25 16:52:27 來源:億速云 閱讀:110 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關怎么深入分析MySQL數據庫事務,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、前言

只有InnoDB引擎支持事務,下邊的內容均以InnoDB引擎為默認條件

二、常見的并發問題

1、臟讀

一個事務讀取了另一個事務未提交的數據

2、不可重復讀

一個事務對同一數據的讀取結果前后不一致。兩次讀取中間被其他事務修改了

3、幻讀

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

三、事務隔離級別

1、讀未提交(READ UNCOMMITTED)

可能產生臟讀、不可重復讀、幻讀

2、讀已提交(READ COMMITTED)

避免了臟讀,可能產生不可重復讀、幻讀

3、可重復讀(REPEATABLE READ)(mysql默認隔離級別)

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

4、串行化(SERIALIZABLE)

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

四、數據庫日志有哪些?

1、undo日志

undo日志用于存放數據修改被修改前的值

UNDO LOG中分為兩種類型,一種是 INSERT_UNDO(INSERT操作),記錄插入的唯一鍵值;

一種是 UPDATE_UNDO(包含UPDATE及DELETE操作),記錄修改的唯一鍵值以及old column記錄。

2、redo日志

mysql會將一個事務中的所有sq先l記錄到redo log中,然后再將記錄從redo log同步到數據文件中

它可以帶來這些好處:

  • 當buffer pool中的dirty page 還沒有刷新到磁盤的時候,發生crash,啟動服務后,可通過redo log 找到需要重新刷新到磁盤文件的記錄;

  • buffer pool中的數據直接flush到disk file,是一個隨機IO,效率較差,而把buffer pool中的數據記錄到redo log,是一個順序IO,可以提高事務提交的速度;

3、binlog日志

用于數據庫主從復制的記錄,是二進制格式。在事務提交之后進行一個磁盤寫入。

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

五、數據庫事務控制

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

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

六、事務的ACID特性

1、原子性(Atomicity)

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

2、一致性(Consistency)

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

3、隔離性(Isolation)

并發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時一樣。比如多個用戶同時往一個賬戶轉賬,最后賬戶的結果應該和他們按先后次序轉賬的結果一樣。

4、持久性(Durability)

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

5、redo log和undo log實現了原子性、一致性、持久性

6、鎖機制實現了隔離性

6.1、快照讀

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

6.2、當前讀

讀取的是最新版本。UPDATE、DELETE、INSERT、SELECT ...  LOCK IN SHARE MODE、SELECT ... FOR UPDATE是當前讀。

6.3、鎖定讀

  在一個事務中,標準的SELECT語句是不會加鎖,但是有兩種情況例外。SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE。

SELECT ... LOCK IN SHARE MODE

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

SELECT ... FOR UPDATE

  給索引記錄加鎖,這種情況下跟UPDATE的加鎖情況是一樣的

6.4、一致性非鎖定讀

consistent read(一致性讀),InnoDB用多版本來提供查詢數據庫在某個時間點的快照。如果隔離級別是REPEATABLE READ,那么在同一個事務中的所有一致性讀都讀的是事務中第一個這樣的讀讀到的快照;如果是READ COMMITTED,那么一個事務中的每一個一致性讀都會讀到它自己刷新的快照版本。Consistent read(一致性讀)是READ COMMITTED和REPEATABLE READ隔離級別下普通SELECT語句默認的模式。一致性讀不會給它所訪問的表加任何形式的鎖,因此其它事務可以同時并發的修改它們。

以上就是怎么深入分析MySQL數據庫事務,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左云县| 岳西县| 博罗县| 达孜县| 赞皇县| 行唐县| 绥阳县| 济阳县| 新巴尔虎右旗| 舞钢市| 广平县| 彭阳县| 都匀市| 潼南县| 铜山县| 礼泉县| 高淳县| 开江县| 朝阳区| 大冶市| 渭南市| 乌拉特前旗| 宜昌市| 翁源县| 小金县| 临武县| 靖西县| 新宁县| 凌云县| 新郑市| 横峰县| 康平县| 上思县| 沛县| 丹东市| 区。| 丁青县| 新余市| 新昌县| 白银市| 筠连县|