【數據庫】—— Mysql事務的簡單剖析

前言

  我是真的不想在csdn上面寫博客了,但看看其他的網站,唉,我還是回來吧。

  涉及到的知識點

  事務併發產生的問題,事務的隔離級別

 

正文

  事務

  一般第一個討論的問題應該都是what,什麼是事務,那我也給大家粘貼一下一個百科釋義

   指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。

 

  然後事務的四大特性也是老生常談了,ACID,這我也不說了

   然後這幾個特性又是如何實現的,不知道有沒有童鞋想過,涉及到兩個文件,redo 和 undo 。

   具體的就不說了,留到後面咱們討論mvcc的時候,在詳細說明。

 

  開啓方式

   自動開啓

   在咱們做增刪改的時候,事務就自動開啓提交了,不然你可以用show VARIABLES like 'autocommit' 看一下,是不是自動提交。

   它又分爲兩個級別,global和session,一般情況下咱麼都不和global玩

           我們可以用set session autocommit = off/on 來設置是不是自動提交,

   手動開啓

   開啓:begin / start transaction

   提交/回滾:commit / rollback

 

  事務併發產生的三大問題

   髒讀

   指,一個事務中,先後兩次讀取同一條數據,而在此期間有另一個事務對其進行修改,但沒有提交,而是進行了回滾,那此時第一個事務就懵逼了。

   

   

   可重複讀

   指,一個事務中,先後兩次讀取同一條數據,而在此期間有另一個事務對其進行了修改,並提交了數據,那此時第一個事務就懵逼了。 

   

   

   幻讀

   指,一個事務中,先後兩次讀取某個範圍內的數據,而在此期間有另一個事務對其進行了插入操作,那此時第一個事務再一次的懵逼了。

   

   

   對比

   髒讀VS可重複讀:都是一個事務讀取同一條數據,先後不一致的問題,髒讀爲第二個事務回滾了事務,可重複讀爲第二個事務提交了事務

   可重複度VS幻讀:都是事務提交事務之後產生的問題,可重複讀爲update / delete,幻讀爲insert

 

  隔離級別

   四個隔離級別

   Read Uncommitted(讀未提交)——  不能解決任何問題

   Read Committed(讀已提交)——  解決髒讀問題

   Repeatable Read(可重複讀)——  解決髒讀和重複讀問題,innodb中已解決幻讀問題

   Serializable(串行化)——  可以解決所有問題

      

   隔離級別的實現方式

   第一種:在讀取數據前,對其進行加鎖,組織其他事務對數據進行修改(LBCC)Lockbased Concurrent Control

   第二種:生成一個數據請求時間點的一致性數據快照(Snapshot),並用這個快照來提供一定級別(語句級或事務級)的一致性讀取(MVCC)Multiversion Concurrency Control

 

   然後基本上今天的所有內容已經結束了,在最後簡單的總結一下。

   事務挺好的,但是在事務併發執行時會有些問題,於是針對這些問題產生了對應的隔離界別,然後隔離級別的實現方式又有兩個,是接下來的兩篇文章將要涉及到的內容。   

結語

  Hello Wrold

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章