亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

MySQL事務與并發控制的知識點有哪些

發布時間:2023-03-30 17:24:15 來源:億速云 閱讀:122 作者:iii 欄目:開發技術

這篇文章主要介紹了MySQL事務與并發控制的知識點有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇MySQL事務與并發控制的知識點有哪些文章都會有所收獲,下面我們一起來看看吧。

    事務


    1. 概念

      一個事務可以理解為一組操作,這一組操作要么全部執行,要么全部不執行。


    2. 特性

      1. Read Uncommit

      2. Read Commit

      3. Repetable Read

      4. Serializable


      5. 原子性

        一個事務是一個獨立的原子單元,一個事務內所有的操作,要么全部執行,要么全部不執行。關注的是一組操作的執行結果(全部成功or全部失敗)。是通過undo log實現的。


      6. 一致性

        看了網上很多博客對一致性的講解,總覺得沒有說到點子上,我就從我的個人角度來說說對一致性的理解:

        一個事務使得數據庫從一個狀態A0,轉換到另一個狀態A1。相鄰的兩個狀態轉換之間,只能有一個事務起作用。如果當前狀態A0轉換到下一個狀態A1,之間包括了2個事務,則說明有一個事務的effect被覆蓋了。如事務并發問題中的丟失更新,典型的例子是轉賬問題,A向B轉賬,同時C也向B轉賬,最后會發現A或者C轉過去的錢不見了,這種例子隨便一搜就有,不贅述。用轉賬問題來解釋一致性,比較好理解,因為錢的總數應該是確定的,比如B本來有1000,A向B轉100,C向B轉200,那么B賬戶上最后應該有1300,然而最終我們可能看到是1100或1200,因為有一個人的操作被覆蓋掉了。其實這也就是說,B賬戶的錢,從一個狀態,到另一個狀態,中間有2個事務起了effect,這樣是不對的。事務具有隔離性,數據庫的每一個狀態,應該都有且僅有一個與之對應的事務在take effect。


      7. 隔離性

        不同的事務之間,應該是不能互相影響的。

        4種隔離級別

        RU相當于沒有隔離,RC和RR是用MVCC實現(具體是通過undo log 和 read view),Serializable是用鎖實現,事務串行執行。

        查看當前的隔離級別

    select @@tx_isolation;
    -- mysql 8的變量名變為如下的形式
    select @@transaction_isolation;
    
    -- 設置隔離級別
    set transacation_isolation = '隔離級別名'

    數據庫隔離級別是一種需求,不同的隔離級別有對應的實現方式。


    1. 持久性

      事務執行成功后(提交后),對數據庫的更改是永久性的(即寫到磁盤)。是通過redo log + Force Log at Commit機制實現的

    2. 事務并發問題

      1. 第一類丟失更新

        針對同一行數據,事務A先開始,事務B后開始,事務B提交,隨后事務A回滾,則回滾會導致將事務B已提交的修改給覆蓋掉。這個問題在現在的數據庫軟件中已不會產生

      2. 第二類丟失更新

        針對同一行數據,事務A先開始,事務B后開始,事務A提交,隨后事務B提交,則事務B將事務A的修改給覆蓋掉了

      3. 丟失更新

      4. 臟讀

        事務A讀到了事務B未提交的數據,事務B后回滾,則事務A讀到的是臟數據

      5. 不可重復讀

        事務A連續2次讀一行記錄,讀取到的是不一樣的。這是由于A連續2次讀的中間,事務B對這行記錄做了更新。

      6. 幻讀

        表現為兩次讀取的數據數量不一致,發現變多了,或者變少了。

        比如我讀取age > 10 的學生數據,第一次讀發現有10個學生,第二次讀發現有20個學生,就好像出現了幻覺一樣,同樣的查詢條件,兩次讀取發現有學生增加或減少。

    3. 事務命令

      MySQL命令行下默認是autocommit的,即事務會自動提交。要顯示開啟一個事務,需使用命令BEGINSTART TRANSACTION

      • BEGIN 或 START TRANSACTION 開啟事務

      • COMMIT 提交事務

      • ROLLBACK 回滾事務

    并發控制

    兩種并發控制策略

    1. MVCC

      Multi-Version Concurrency Control

      核心理念是快照,InnoDB主要通過undo log 和 read view來實現MVCC。

      **讀不加鎖,讀寫不互斥。**讀會從多個版本的數據中挑選一個合適的版本返回。寫操作會產生一個新的版本。

      每一行的記錄,會包含3個隱藏字段:row_id,tx_id,roll_ptr

      其中tx_id表示最近操作該行記錄的事務id,roll_ptr則是回滾指針,指向一條undo log記錄,即指向該次改動之前的數據

    MySQL事務與并發控制的知識點有哪些

    undo log
    • insert undo log

      由insert操作產生,可在事務提交后直接刪除。因為insert操作只對當前事務本身可見,其他事務不可見

    • update undo log

      由update/delete產生。是對已有記錄的修改,為了提供MVCC機制,該undo log不能在事務提交后就刪除,而需要等待purge線程來進行最后的刪除

      使用update修改當前行時,首先用X鎖鎖定,然后將該行當前值復制到undo log,然后再執行修改,最后填寫事務id,并使回滾指針指向undo log中修改前的行

    MySQL事務與并發控制的知識點有哪些

    read view

    用于判斷數據可見性的一個數據結構,里面存儲了

    • 當前活躍事務的最小id:min_id

    • 當前活躍事務的最大id:max_id

    • 當前活躍事務id list:ids

    若讀取到的某一行的某個版本tx_id < min_id,則說明此行的該版本在本次事務開啟之前就已經提交,故這個數據對本次事務可見。

    若讀取到的某一行的某個版本tx_id >= max_id,說明此行的該版本在本次事務開啟之后才開始進行修改,故這個數據對本次事務不可見。

    若讀取到的某一行的某個版本tx_id在min_id和max_id之間,則判斷此行的tx_id是否在ids內,若是,表明此行的事務還在活躍中,此行數據不可見,否則,說明此行的事務已經提交,此行數據可見

    簡單來說,若在某一時刻開啟了一個事務A,則會記錄下事務A開啟時,還活躍著的其他事務(記下這些活躍事務的id,保存為一個set,比如叫ids),這些事務按照開始的時間先后,會有從小到大的事務id(tx_id),tx_id小的事務,說明是先開啟的,tx_id大的事務,說明是后開啟的。若在事務A中,讀取到某一行數據,這一行數據的tx_id小于ids中最小的id(min_id),說明這一行數據對應的事務,已提交過了(已不活躍了),這一行數據的修改已經持久化,故該行數據對事務A來說是可見的。若這一行數據的tx_id大于或等于ids中的最大id,說明有一個事務,在事務A開始之后,才開始對這一行數據進行修改,故該行數據對事務A不可見。若這一行數據的tx_id,在min_id和max_id之間,那么就判斷這個tx_id是不是在ids中,即對這行數據進行修改的那個事務,還在不在活躍的事務列表中,若在,說明修改這行數據的事務還沒提交,這行數據還沒持久化,故不可見,反之,說明這行數據的修改已經持久化,故可見。

    RC隔離級別下,在一個事務中,每次讀取數據都會新建一個ReadView。所以可能會產生不可重復讀的問題,因為在兩次讀之間,有其他事務對數據進行了修改,而兩次讀時都新建了ReadView,故第二次讀的時候,修改后的數據是可見的。

    RR隔離級別下,在一個事務中,第一次讀取時會新建一個ReadView,后序讀取都使用這個ReadView。所以哪怕在兩次讀之間,有其他事務修改了數據,也不會產生不可重復讀的問題。因為第二次讀,并沒有新建ReadView,而是使用了一開始創建的那個ReadView,所以數據可見性和第一次是一樣的。

    MVCC中,讀操作分為兩類:快照讀,當前讀

    • 快照讀(一致性非鎖定讀)
      讀取的時記錄的可見版本(可能是歷史版本),不加鎖。
      當某一行被一個事務A加了X鎖時,另一個事務B仍然可以讀取該行,只不過讀取的是歷史版本。

    -- 簡單select
    SELECT * FROM product;
    • 當前讀

    讀取的是記錄的最新版本,當前讀返回的記錄,會加鎖,保證了其他并發事務不能修改當前記錄

    SELECT * FROM product lock in share mode;
    SELECT * FROM product for update;
    insert ....
    update ....
    delete ....

    LBCC

    LCC

    Lock-Based Concurrency Control

    讀加讀鎖,寫加寫鎖。讀讀不互斥,讀寫,寫寫互斥。Serilizable的隔離級別是通過LBCC實現的

    關于“MySQL事務與并發控制的知識點有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“MySQL事務與并發控制的知識點有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

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

    AI

    慈利县| 塘沽区| 台南县| 景洪市| 峡江县| 花垣县| 瓮安县| 小金县| 巴里| 睢宁县| 汾阳市| 新巴尔虎左旗| 长治市| 台东县| 蓬安县| 南陵县| 宜川县| 昌图县| 巫溪县| 白沙| 竹溪县| 泾川县| 饶河县| 宁波市| 惠州市| 惠来县| 凤翔县| 剑阁县| 岑巩县| 福安市| 藁城市| 迭部县| 新丰县| 文昌市| 六安市| 隆子县| 金堂县| 太原市| 合水县| 云和县| 大关县|