最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql事務(wù)隔離級(jí)別原理實(shí)例解析

 更新時(shí)間:2020年03月24日 10:21:06   作者:孤獨(dú)煙  
這篇文章主要介紹了Mysql事務(wù)隔離級(jí)別原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

引言

大家在面試中一定碰到過

說說事務(wù)的隔離級(jí)別吧?

老實(shí)說,事務(wù)隔離級(jí)別這個(gè)問題,無論是校招還是社招,面試官都愛問!然而目前網(wǎng)上很多文章,說句實(shí)在話啊,我看了后我都懷疑作者弄懂沒!因?yàn)樗麄儗?duì)可重復(fù)讀(Repeatable Read)和串行化(serializable)的解析實(shí)在是看的我一頭霧水!

再加上很多書都說可重復(fù)讀解決了幻讀問題,比如《mysql技術(shù)內(nèi)幕--innodb存儲(chǔ)引擎》等,不一一列舉了,因此網(wǎng)上關(guān)于事務(wù)隔離級(jí)別的文章大多是有問題的,所以再開一文說明!

本文所講大部分內(nèi)容,皆有官網(wǎng)作為佐證,因此對(duì)本文內(nèi)容你可以看完后,你完全可以當(dāng)概念記在腦海里,除非官網(wǎng)的開發(fā)手冊(cè)是錯(cuò)的,否則應(yīng)當(dāng)無誤!

另外,本文會(huì)重點(diǎn)說一下

可重復(fù)讀(Repeatable Read)是否真的解決幻讀的問題!

正文

開始我先提一下,根據(jù)事務(wù)的隔離級(jí)別不同,會(huì)有三種情況發(fā)生。即臟讀、不可重復(fù)讀、幻讀。這里我先不提這三種情況的定義,后面在講隔離級(jí)別的時(shí)候會(huì)補(bǔ)上。

這里,大家記住一點(diǎn),根據(jù)臟讀、不可重復(fù)讀、幻讀定義來看(自己總結(jié),官網(wǎng)沒有),有如下包含關(guān)系:


那么,這張圖怎么理解呢?

即,如果發(fā)生了臟讀,那么不可重復(fù)讀和幻讀是一定發(fā)生的。因?yàn)槟门K讀的現(xiàn)象,用不可重復(fù)讀,幻讀的定義也能解釋的通。但是反過來,拿不可重復(fù)讀的現(xiàn)象,用臟讀的定義就不一定解釋的通了!

假設(shè)有表tx_tb如下,pId為主鍵

pId name
1 zhangsan

1、讀未提交(READ_UNCOMMITTED)

其實(shí)這個(gè)從隔離名字就可以看出來,一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)!為了便于說明,我簡(jiǎn)單的畫圖說明!

如圖所示,一個(gè)事務(wù)檢索的數(shù)據(jù)被另一個(gè)未提交的事務(wù)給修改了。

官網(wǎng)對(duì)臟讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_dirty_read

其內(nèi)容為

**dirty read
An operation that retrieves unreliable data, data that was updated by another transaction but not yet committed.
**

翻譯過來就是

檢索操作出來的數(shù)據(jù)是不可靠的,是可以被另一個(gè)未提交的事務(wù)修改的!

你會(huì)發(fā)現(xiàn),我們的演示結(jié)果和官網(wǎng)對(duì)臟讀的定義一致。根據(jù)我們最開始的推理,如果存在臟讀,那么不可重復(fù)讀和幻讀一定是存在的。

2、讀已提交(READ_COMMITTED)

這個(gè)也能看的出來,一個(gè)事務(wù)能讀到另一個(gè)事務(wù)已提交的數(shù)據(jù)!為了便于說明,我簡(jiǎn)單的畫圖說明!

如圖所示,一個(gè)事務(wù)檢索的數(shù)據(jù)只能被另一個(gè)已提交的事務(wù)修改。

官網(wǎng)對(duì)不可重復(fù)讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_non_repeatable_read

其內(nèi)容為

**non-repeatable read
The situation when a query retrieves data, and a later query within the same transaction retrieves what should be the same data, but the queries return different results (changed by another transaction committing in the meantime).
**

翻譯過來就是

一個(gè)查詢語(yǔ)句檢索數(shù)據(jù),隨后又有一個(gè)查詢語(yǔ)句在同一個(gè)事務(wù)中檢索數(shù)據(jù),兩個(gè)數(shù)據(jù)應(yīng)該是一樣的,但是實(shí)際情況返回了不同的結(jié)果。!

ps:作者注,這里的不同結(jié)果,指的是在行不變的情況下(專業(yè)點(diǎn)說,主鍵索引沒變),主鍵索引指向的磁盤上的數(shù)據(jù)內(nèi)容變了。如果主鍵索引變了,比如新增一條數(shù)據(jù)或者刪除一條數(shù)據(jù),就不是不可重復(fù)讀。

顯然,我們這個(gè)現(xiàn)象符合不可重復(fù)讀的定義。下面,大家做一個(gè)思考:

這個(gè)不可重復(fù)讀的定義,放到臟讀的現(xiàn)象里是不是也可以說的通。顯然臟讀的現(xiàn)象,也就是**讀未提交(READ_UNCOMMITTED)**的那個(gè)例子,是不是也符合在同一個(gè)事務(wù)中返回了不同結(jié)果!但是反過來就不一定通了,一個(gè)事務(wù)A中查詢兩次的結(jié)果在被另一個(gè)事務(wù)B改變的情況下,如果事務(wù)B未提交就改變了事務(wù)A的結(jié)果,就屬于臟讀,也屬于不可重復(fù)讀。如果該事務(wù)B提交了才改變事務(wù)A的結(jié)果,就不屬于臟讀,但屬于不可重復(fù)讀。3、可重復(fù)讀(REPEATABLE_READ)

這里,我改變一下順序,先上幻讀的定義

官網(wǎng)對(duì)幻讀定義的地址為

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_phantom

phantom
A row that appears in the result set of a query, but not in the result set of an earlier query. For example, if a query is run twice within a transaction, and in the meantime, another transaction commits after inserting a new row or updating a row so that it matches the WHERE clause of the query.

翻譯過來就是

在一次查詢的結(jié)果集里出現(xiàn)了某一行數(shù)據(jù),但是該數(shù)據(jù)并未出現(xiàn)在更早的查詢結(jié)果集里。例如,在一次事務(wù)里進(jìn)行了兩次查詢,同時(shí)另一個(gè)事務(wù)插入某一行或更新某一行數(shù)據(jù)后(該數(shù)據(jù)符合查詢語(yǔ)句里where后的條件),并提交了!

好了,接下來上圖,大家自己評(píng)定該現(xiàn)象是否符合幻讀的定義

顯然,該現(xiàn)象是符合幻讀的定義的。同一事務(wù)的兩次相同查詢出現(xiàn)不同行。下面,大家做一個(gè)思考:

這個(gè)幻讀的定義,放到不可重復(fù)讀的現(xiàn)象里是不是也可以說的通。大家自行思考!反過來就不一定通了。事務(wù)第二次查詢出了一個(gè)數(shù)據(jù),但是該數(shù)據(jù)并未出現(xiàn)在第一次查詢的結(jié)果集里。如果該數(shù)據(jù)是修改數(shù)據(jù),那么該現(xiàn)象既屬于不可重復(fù)讀,也屬于幻讀。如果該數(shù)據(jù)是新增或刪除的數(shù)據(jù),那該現(xiàn)象就不屬于不可重復(fù)讀,但屬于幻讀。

接下來說一下,為什么很多文章都產(chǎn)生誤傳,說是可重復(fù)讀可以解決幻讀問題!原因出自官網(wǎng)的一句話
(地址是:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks)

原文內(nèi)容如下

By default, InnoDB operates in REPEATABLE READ transaction isolation level. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows (see Section 14.7.4, “Phantom Rows”).

按照原本這句話的意思,應(yīng)該是

InnoDB默認(rèn)用了REPEATABLE READ。在這種情況下,使用next-key locks解決幻讀問題!

結(jié)果估計(jì),某個(gè)國(guó)內(nèi)翻譯人員翻著翻著變成了

InnoDB默認(rèn)用了REPEATABLE READ。在這種情況下,可以解決幻讀問題!

然后大家繼續(xù)你抄我,我抄你,結(jié)果你懂的!

顯然,漏了"使用了next-key locks!"這個(gè)條件后,意思完全改變,我們?cè)谠摳綦x級(jí)別下執(zhí)行語(yǔ)句

select * from tx_tb where pId >= 1;

是快照讀,是不加任何鎖的,根本不能解決幻讀問題,除非你用

select * from tx_tb where pId >= 1 lock in share mode;

這樣,你就用上了next-key locks,解決了幻讀問題!

4、串行讀(SERIALIZABLE_READ)

在該隔離級(jí)別下,所有的select語(yǔ)句后都自動(dòng)加上lock in share mode。因此,在該隔離級(jí)別下,無論你如何進(jìn)行查詢,都會(huì)使用next-key locks。所有的select操作均為當(dāng)前讀!


OK,注意看上表紅色部分!就是因?yàn)槭褂昧薾ext-key locks,innodb將PiD=1這條索引記錄,和(1,++∞)這個(gè)間隙鎖住了。其他事務(wù)要在這個(gè)間隙上插數(shù)據(jù),就會(huì)阻塞,從而防止幻讀發(fā)生!

有的人會(huì)說,你這第二次查詢的結(jié)果,也變了啊,明顯和第一次查詢結(jié)果不一樣啊?對(duì)此,我只能說,請(qǐng)看清楚啊。這是被自己

的事務(wù)改的,不是被其他事物修改的。這不算是幻讀,也不是不可重復(fù)讀。

總結(jié)

上面羅里吧嗦一大堆,最后來一個(gè)表格做總結(jié)吧,你面試答這個(gè)表就行。上面的一切是為了這張表做準(zhǔn)備!

隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀未提交
不可重復(fù)讀
可重復(fù)讀
串行化

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql修改字段類型、長(zhǎng)度及添加刪除列實(shí)例代碼

    Mysql修改字段類型、長(zhǎng)度及添加刪除列實(shí)例代碼

    在MySQL中可以使用ALTER?TABLE語(yǔ)句來修改表結(jié)構(gòu),包括添加自增屬性,下面這篇文章主要給大家介紹了關(guān)于Mysql修改字段類型、長(zhǎng)度及添加刪除列的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • mysql 8.0.15 安裝圖文教程及數(shù)據(jù)庫(kù)基礎(chǔ)

    mysql 8.0.15 安裝圖文教程及數(shù)據(jù)庫(kù)基礎(chǔ)

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 安裝方法圖文教程,及數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MySQL全面瓦解之查詢的正則匹配詳解

    MySQL全面瓦解之查詢的正則匹配詳解

    這篇文章主要給大家介紹了關(guān)于MySQL全面瓦解之查詢的正則匹配的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL日期格式化yyyy-mm-dd詳解(DATE_FORMAT()函數(shù))

    MySQL日期格式化yyyy-mm-dd詳解(DATE_FORMAT()函數(shù))

    MySQL提供了很多功能強(qiáng)大、方便易用的函數(shù),在進(jìn)行數(shù)據(jù)庫(kù)管理以及數(shù)據(jù)的查詢和操作時(shí),幫助我們提高對(duì)數(shù)據(jù)庫(kù)的管理效率,下面這篇文章主要給大家介紹了關(guān)于MySQL日期格式化yyyy-mm-dd(DATE_FORMAT()函數(shù))的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • mysql 5.7.21 winx64綠色版安裝配置方法圖文教程

    mysql 5.7.21 winx64綠色版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.21 winx64綠色版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • mysql是否需要容器化深入分析

    mysql是否需要容器化深入分析

    這篇文章主要為大家介紹了mysql是否需要容器化深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 關(guān)于加強(qiáng)MYSQL安全的幾點(diǎn)建議

    關(guān)于加強(qiáng)MYSQL安全的幾點(diǎn)建議

    現(xiàn)在php+mysql組合越來越多,這里腳本之家小編就為大家分享一下mysql的安裝設(shè)置的幾個(gè)小技巧
    2016-04-04
  • mysql query browser中文亂碼的解決方法

    mysql query browser中文亂碼的解決方法

    在網(wǎng)上也搜看了一下再mysql query browser中解決中文亂碼的問題,答案各不相同
    2010-09-09
  • 詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫(kù)

    詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫(kù)

    這篇文章主要介紹了詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫(kù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL數(shù)據(jù)庫(kù)字符集修改中文UTF8(永久修改)

    MySQL數(shù)據(jù)庫(kù)字符集修改中文UTF8(永久修改)

    本文主要介紹了MySQL數(shù)據(jù)庫(kù)字符集修改中文UTF8,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

台州市| 永嘉县| 乌审旗| 建阳市| 嘉义县| 绥滨县| 盐亭县| 齐河县| 丁青县| 岗巴县| 静安区| 会昌县| 金门县| 全州县| 田阳县| 东源县| 和林格尔县| 泰宁县| 清流县| 汕头市| 耒阳市| 赫章县| 临朐县| 安阳县| 谷城县| 平潭县| 会东县| 木兰县| 阿图什市| 宝鸡市| 平罗县| 蒲江县| 黄石市| 图片| 广德县| 达日县| 湘阴县| 吴忠市| 乌兰察布市| 伊金霍洛旗| 濮阳市|