91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

MySQL的事務隔離級別有那些

發布時間:2021-05-08 16:00:42 來源:億速云 閱讀:139 作者:Leah 欄目:開發技術

MySQL的事務隔離級別有那些?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

事務隔離級別

事務并發執行遇到的問題

  • 臟寫

    • 如果一個事務修改了另一個未提交事務修改過的數據,那就意味著發生了臟寫

  • 臟讀

    • 如果一個事務讀到了另一個未提交事務修改過的數據,那就意味著發生了臟讀

  • 不可重復讀

    • 如果一個事務只能讀到另一個已經提交的事務修改過的數據,并且其他事務每對該數據進行一次修改并提交后,該事務都能查詢到最新值,那就意味著發生了不可重復讀

  • 幻讀

    • 如果一個事務先根據某些條件查詢出一些記錄,之后另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來,那就意味著發生了幻讀。

    • 幻讀強調的是一個事務按照某個相同條件多次讀取記錄時,后讀取時讀到了之前沒有讀到的記錄

    • 那對于先前已經讀到的記錄,之后又讀取不到這種情況,算啥呢?其實這相當于對每一條記錄都發生了不可重復讀的現象。幻讀只是重點強調了讀取到了之前讀取沒有獲取到的記錄。

SQL標準中的四種隔離級別

  • READ UNCOMMITTED: 未提交讀 臟讀、不可重復讀、幻讀 發生

  • READ COMMITTED:已提交讀 不可重復讀、幻讀 發生

  • REPEATBLE READ:可重復讀 幻讀 發生

  • SERIALIZABLE:可串行化 不發生

MySQL中支持的四種隔離級別

  • MySQL在REPEATABLE READ隔離級別下,是可以禁止幻讀問題的發生的(關于如何禁止我們之后會詳細說明的)

  • MySQL默認隔離級別為REPEATABLE READ

MVCC原理

版本鏈

對于使用InnoDB存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列

  • trx_id:每次一個事務對某條聚簇索引記錄進行改動時,都會把該事務的事務id賦值給trx_id隱藏列

  • roll_pointer:每次對某條聚簇索引記錄進行改動時,都會把舊的版本寫入到undo日志,然后這個隱藏列就相當于一個指針,可以通過它來找到該記錄修改前的信息。

ReadView

  • 對于使用READ UNCIMMITTED隔離級別的事務來說,由于可以讀到未提交事務修改過的記錄,所以直接讀取記錄的最新版本就好了;

  • 對于使用READ COMMITTED 和REPEATABLE READ 隔離級別的事務來說,都必須保證讀到已經提交了的事務修改過的記錄,也就是說假如另一個事務已經修改了記錄但是尚未提交,是不能直接讀取到最新版本記錄的。核心問題:需要判斷一下版本鏈中的哪個版本是當前事務可見的。為此設計了readview

  • readView包含4個比較重要的內容:

    • 我們前邊說過,只有在對表中的記錄做改動時(執行INSERT、DELETE、UPDATE這些語句時)才會為事務分配事務id,否則在一個只讀事務中的事務id值都默認為0。

    • m_ids:表示在生成ReadView時當前系統中活躍的讀寫事務的事務ID

    • min_trx_id:表示生成ReadView時當前系統中活躍的讀寫事務中最小的事務id,也就是m_ids中的最小值

    • max_trx_id: 表示生成ReadView時系統中應該分配給下一個事務的id值

    • creator_trx_id:表示生成該ReadView的事務的事務ID

  • 有了這個ReadView,這樣在訪問某條記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:

    • 如果被訪問的版本的trx_id屬性與ReadView中的creator_trx_id相同,意味著當前事務在訪問它自己修改過的記錄,所以該版本可以被當前事務訪問

    • 如果被訪問的trx_id屬性值小于ReadView中的min_trx_id值,表明生成該版本的事務在當前事務生成ReadView時已經提交,所以該版本可以被當前事務訪問

    • 如果被訪問版本的trx_id屬性值大于或等于ReadView中的max_trx_id值,表明生成該版本的事務在當前事務生成ReadView后才開啟,所以該版本不可以被當前事務訪問

    • 如果被訪問版本的trx_id屬性值在ReadView的min_trx_id和max_trx_id之間,那就需要判斷一下trx_id屬性值是不是在m_ids列表中,如果在,說明創建ReadView時生成該版本的事務還是活躍的,該版本不可被訪問;如果不在,說明創建ReadView時生成該版本的事務已經被提交,該版本可以被訪問。

總結一下:

  • READ COMMITTED隔離級別的事務在每次查詢開始時都會生成一個獨立的ReadView

  • REPEATABLE READ :在第一次讀取數據時生成一個ReadView,也就是說兩次SELECT 查詢得到的結果是重復的。

MVCC總結: 所謂的MVCC指的就是在使用 READ COMMITTED 和REPEATABLE READ 這兩種隔離級別的事務在執行普通的SELECT 操作時訪問的記錄的版本鏈的過程,這樣子可以使不用的事務的讀-寫、寫-讀操作并發執行,從而提升性能。

mysql如何在RR級別解決幻讀的

1.當前讀,讀的是最新版本,并且需要獲取對應記錄的鎖,如下SQL

  • select ... lock in share mode

  • select ... for update

  • update 、delete 、insert

是通過next-key 來實現幻讀的

2.快照讀 是通過mvcc 來解決的

看完上述內容,你們掌握MySQL的事務隔離級別有那些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

杭锦旗| 敦化市| 鄄城县| 鹤壁市| 福安市| 岳普湖县| 肇东市| 都兰县| 潮安县| 崇文区| 许昌市| 六枝特区| 迁安市| 阜阳市| 眉山市| 芒康县| 汉中市| 志丹县| 沙坪坝区| 师宗县| 普宁市| 民权县| 沁水县| 达尔| 苍梧县| 车险| 台安县| 吉隆县| 滁州市| 西宁市| 万安县| 和田县| 鹤岗市| 若尔盖县| 南京市| 南郑县| 绥中县| 九江县| 靖边县| 乌鲁木齐县| 永和县|