亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

MySQL 事務(wù)隔離級(jí)別是為了解決并發(fā)事務(wù)互相干擾的問題的,MySQL 事務(wù)隔離級(jí)別總共有以下 4 種:

  1. READ UNCOMMITTED:讀未提交。
  2. READ COMMITTED:讀已提交。
  3. REPEATABLE READ:可重復(fù)讀。
  4. SERIALIZABLE:序列化。

1.四種事務(wù)隔離級(jí)別

1.1 READ UNCOMMITTED

讀未提交,也叫未提交讀,該隔離級(jí)別的事務(wù)可以看到其他事務(wù)中未提交的數(shù)據(jù)。該隔離級(jí)別因?yàn)榭梢宰x取到其他事務(wù)中未提交的數(shù)據(jù),而未提交的數(shù)據(jù)可能會(huì)發(fā)生回滾,因此我們把該級(jí)別讀取到的數(shù)據(jù)稱之為臟數(shù)據(jù),把這個(gè)問題稱之為臟讀。

1.2 READ COMMITTED

讀已提交,也叫提交讀,該隔離級(jí)別的事務(wù)能讀取到已經(jīng)提交事務(wù)的數(shù)據(jù),因此它不會(huì)有臟讀問題。但由于在事務(wù)的執(zhí)行中可以讀取到其他事務(wù)提交的結(jié)果,所以在不同時(shí)間的相同 SQL 查詢中,可能會(huì)得到不同的結(jié)果,這種現(xiàn)象叫做不可重復(fù)讀。

1.3 REPEATABLE READ

可重復(fù)讀,MySQL 默認(rèn)的事務(wù)隔離級(jí)別??芍貜?fù)讀可以解決“不可重復(fù)讀”的問題,但還存在幻讀的問題。所謂的幻讀指的是,在同一事務(wù)的不同時(shí)間使用相同 SQL 查詢時(shí),會(huì)產(chǎn)生不同的結(jié)果。例如,一個(gè) SELECT 被執(zhí)行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個(gè)“幻像”行。

注意:幻讀和不可重復(fù)讀的側(cè)重點(diǎn)是不同的,不可重復(fù)讀側(cè)重于數(shù)據(jù)修改,兩次讀取到的同一行數(shù)據(jù)不一樣;而幻讀側(cè)重于添加或刪除,兩次查詢返回的數(shù)據(jù)行數(shù)不同。

1.4 SERIALIZABLE

序列化,事務(wù)最高隔離級(jí)別,它會(huì)強(qiáng)制事務(wù)排序,使之不會(huì)發(fā)生沖突,從而解決了臟讀、不可重復(fù)讀和幻讀問題,但因?yàn)閳?zhí)行效率低,所以真正使用的場景并不多。

1.5 小結(jié)

簡單總結(jié)一下,MySQL 中的事務(wù)隔離級(jí)別就是為了解決臟讀、不可重復(fù)讀和幻讀等問題的,這 4 種隔離級(jí)別與這 3 個(gè)問題之間的對(duì)應(yīng)關(guān)系如下:

事務(wù)隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀未提交(READ UNCOMMITTED)
讀已提交(READ COMMITTED) ×
可重復(fù)讀(REPEATABLE READ) × ×
串行化(SERIALIZABLE) × × ×

2.并發(fā)事務(wù)中的問題

并發(fā)事務(wù)中存在以下 3 個(gè)問題。

2.1 臟讀

一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)為提交保存的數(shù)據(jù),之后此事務(wù)進(jìn)行了回滾操作,從而導(dǎo)致第一個(gè)事務(wù)讀取了一個(gè)不存在的臟數(shù)據(jù)。

2.2 不可重復(fù)讀

在同一個(gè)事務(wù)中,同一個(gè)查詢?cè)诓煌臅r(shí)間得到了不同的結(jié)果。例如事務(wù)在 T1 讀取到了某一行數(shù)據(jù),在 T2 時(shí)間重新讀取這一行時(shí)候,這一行的數(shù)據(jù)已經(jīng)發(fā)生修改,所以再次讀取時(shí)得到了一個(gè)和 T1 查詢時(shí)不同的結(jié)果。

2.3 幻讀

MySQL 對(duì)幻讀的定義如下:

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times.  For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/innodb-next-key-locking.html翻譯為中文是:同一個(gè)查詢?cè)诓煌瑫r(shí)間得到了不同的結(jié)果,這就是事務(wù)中的幻讀問題。例如,一個(gè) SELECT 被執(zhí)行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個(gè)“幻像”行。

3.隔離級(jí)別實(shí)戰(zhàn)

3.1 查詢事務(wù)隔離級(jí)別

查看全局 MySQL 事務(wù)隔離級(jí)別和當(dāng)前會(huì)話的事務(wù)隔離級(jí)別的 SQL 如下:

select @@global.tx_isolation,@@tx_isolation; 

以上 SQL 執(zhí)行結(jié)果如下圖所示:

圖片

3.2 設(shè)置事務(wù)隔離級(jí)別

每個(gè)連接到 MySQL 的客戶端可以單獨(dú)設(shè)置事務(wù)的隔離級(jí)別,MySQL 可以使用以下 SQL 設(shè)置當(dāng)前連接(客戶端)的事務(wù)隔離級(jí)別:

set session transaction isolation level 事務(wù)隔離級(jí)別;

其中事務(wù)隔離級(jí)別有 4 個(gè)值:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SERIALIZABLE

    3.3 臟讀問題

    一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)為提交保存的數(shù)據(jù),之后此事務(wù)進(jìn)行了回滾操作,從而導(dǎo)致第一個(gè)事務(wù)讀取了一個(gè)不存在的臟數(shù)據(jù)。接下來,我們使用 SQL 來演示一下臟讀問題。

正式開始之前,先創(chuàng)建一個(gè)測試表:

-- 創(chuàng)建一個(gè)城市表
drop table if exists city;
create table city(
    id int primary key auto_increment,
    name varchar(250) not null
);

臟讀的執(zhí)行順序如下:

圖片

臟讀的執(zhí)行 SQL 和執(zhí)行順序如下:

  1. 客戶端 A:set session transaction isolation level read uncommitted;
  2. 客戶端 A:start transaction;
  3. 客戶端 B:start transaction;
  4. 客戶端 B:insert into city(name) values('西安');
  5. 客戶端 A:select * from city;
  6. 客戶端 B:rollback;
  7. 客戶端 A:select * from city;

對(duì)應(yīng)的執(zhí)行結(jié)果如下圖所示:

圖片

從上述結(jié)果可以看出,當(dāng)把客戶端 A 設(shè)置為讀未提交的事務(wù)隔離級(jí)別后,客戶端 A 可以讀取到其他事務(wù)未提交的數(shù)據(jù),當(dāng)其他事務(wù)回滾之后,客戶端 A 讀取的數(shù)據(jù)就成了臟數(shù)據(jù),這就是臟讀,也就是讀未提交的事務(wù)隔離級(jí)別中存在臟讀的問題。

3.4 不可重復(fù)讀問題

在同一個(gè)事務(wù)中,同一個(gè)查詢?cè)诓煌臅r(shí)間得到了不同的結(jié)果。例如事務(wù)在 T1 讀取到了某一行數(shù)據(jù),在 T2 時(shí)間重新讀取這一行時(shí)候,這一行的數(shù)據(jù)已經(jīng)發(fā)生修改,所以再次讀取時(shí)得到了一個(gè)和 T1 查詢時(shí)不同的結(jié)果。

不可重復(fù)讀的執(zhí)行順序如下:

圖片

不可重復(fù)讀的執(zhí)行 SQL 和執(zhí)行順序如下:

  1. 客戶端 A:set session transaction isolation level read committed;
  2. 客戶端 A:start transaction;
  3. 客戶端 A:select * from city where id=1;
  4. 客戶端 B:start transaction;
  5. 客戶端 B:update city set name='長安' where id=1;
  6. 客戶端 B:commit;
  7. 客戶端 A:select * from city where id=1;

對(duì)應(yīng)執(zhí)行的結(jié)果如下圖所示:

圖片

從上述結(jié)果中可以看出,客戶端 A 被設(shè)置了讀已提交的事務(wù)隔離級(jí)別之后,使用同樣的 SQL 兩次讀取到的同一條數(shù)據(jù),內(nèi)容是不一樣的,這就是不可重復(fù)讀。也就是讀已提交的事務(wù)隔離級(jí)別中,可能存在不可重復(fù)讀的問題。

3.5 幻讀問題

同一個(gè)查詢?cè)诓煌瑫r(shí)間得到了不同的結(jié)果,這就是事務(wù)中的幻讀問題。例如,一個(gè) SELECT 被執(zhí)行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個(gè)“幻像”行。

幻讀的執(zhí)行順序如下:

圖片

幻讀的執(zhí)行 SQL 和執(zhí)行順序如下:客戶端 A:set session transaction isolation level repeatable read; 客戶端 A:start transaction; 客戶端 A:select * from city where id<5; --查詢出1條數(shù)據(jù) 客戶端 B:start transaction; 客戶端 B:insert into city(id,name) values(2,'北京'); 客戶端 B:commit; 客戶端 A:update city set name='京城' where id=2; 客戶端 A:select * from city where id<5; --查詢出2條數(shù)據(jù) 對(duì)應(yīng)執(zhí)行的結(jié)果如下圖所示:

圖片

從上述結(jié)果可以看出,客戶端 A 被設(shè)置了可重復(fù)讀的事務(wù)隔離級(jí)別之后,使用相同的 SQL 卻查詢出了一樣的結(jié)果,第一次查詢出了一條數(shù)據(jù),而第二次查詢出了兩條數(shù)據(jù),多出來的這行數(shù)據(jù)就叫做“幻像”行,因此我們可以得出結(jié)果,在可重復(fù)讀中可能會(huì)存在幻讀的問題。

總結(jié)

MySQL 中有 4 種事務(wù)隔離級(jí)別:讀未提交(存在臟讀/不可重復(fù)讀/幻讀問題)、讀已提交(存在不可重復(fù)讀/幻讀問題)、可重復(fù)讀(存在幻讀問題)和序列化,其中可重復(fù)讀是 MySQL 默認(rèn)的事務(wù)隔離級(jí)別。臟讀是讀到了其他事務(wù)未提交的數(shù)據(jù),不可重復(fù)讀是讀到了其他事務(wù)修改的數(shù)據(jù),而幻讀則是讀取到了其他事務(wù)新增或刪除的“幻像”行數(shù)據(jù)。

分享到:
標(biāo)簽:MySQL
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定