成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:說一下MySQL事務隔離級別?

數據庫 MySQL
MySQL 中有 4 種事務隔離級別:讀未提交(存在臟讀/不可重復讀/幻讀問題)、讀已提交(存在不可重復讀/幻讀問題)、可重復讀(存在幻讀問題)和序列化,其中可重復讀是 MySQL 默認的事務隔離級別。

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

MySQL 事務隔離級別是為了解決并發事務互相干擾的問題的,MySQL 事務隔離級別總共有以下 4 種:

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

一、四種事務隔離級別

1、READ UNCOMMITTED

讀未提交,也叫未提交讀,該隔離級別的事務可以看到其他事務中未提交的數據。該隔離級別因為可以讀取到其他事務中未提交的數據,而未提交的數據可能會發生回滾,因此我們把該級別讀取到的數據稱之為臟數據,把這個問題稱之為臟讀。

2、READ COMMITTED

讀已提交,也叫提交讀,該隔離級別的事務能讀取到已經提交事務的數據,因此它不會有臟讀問題。但由于在事務的執行中可以讀取到其他事務提交的結果,所以在不同時間的相同 SQL 查詢中,可能會得到不同的結果,這種現象叫做不可重復讀。

3、REPEATABLE READ

可重復讀,MySQL 默認的事務隔離級別。可重復讀可以解決“不可重復讀”的問題,但還存在幻讀的問題。所謂的幻讀指的是,在同一事務的不同時間使用相同 SQL 查詢時,會產生不同的結果。例如,一個 SELECT 被執行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個“幻像”行。

注意:幻讀和不可重復讀的側重點是不同的,不可重復讀側重于數據修改,兩次讀取到的同一行數據不一樣;而幻讀側重于添加或刪除,兩次查詢返回的數據行數不同。

4、SERIALIZABLE

序列化,事務最高隔離級別,它會強制事務排序,使之不會發生沖突,從而解決了臟讀、不可重復讀和幻讀問題,但因為執行效率低,所以真正使用的場景并不多。

5、小結

簡單總結一下,MySQL 中的事務隔離級別就是為了解決臟讀、不可重復讀和幻讀等問題的,這 4 種隔離級別與這 3 個問題之間的對應關系如下:

事務隔離級別

臟讀

不可重復讀

幻讀

讀未提交(READ UNCOMMITTED)

讀已提交(READ COMMITTED)

×

可重復讀(REPEATABLE READ)

×

×

串行化(SERIALIZABLE)

×

×

×

二、并發事務中的問題

并發事務中存在以下 3 個問題。

1、臟讀

一個事務讀取到了另一個事務為提交保存的數據,之后此事務進行了回滾操作,從而導致第一個事務讀取了一個不存在的臟數據。

2、不可重復讀

在同一個事務中,同一個查詢在不同的時間得到了不同的結果。例如事務在 T1 讀取到了某一行數據,在 T2 時間重新讀取這一行時候,這一行的數據已經發生修改,所以再次讀取時得到了一個和 T1 查詢時不同的結果。

3、幻讀

MySQL 對幻讀的定義如下:

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翻譯為中文是:同一個查詢在不同時間得到了不同的結果,這就是事務中的幻讀問題。例如,一個 SELECT 被執行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個“幻像”行。

三、隔離級別實戰

1、查詢事務隔離級別

查看全局 MySQL 事務隔離級別和當前會話的事務隔離級別的 SQL 如下:

select @@global.tx_isolation,@@tx_isolation;

以上 SQL 執行結果如下圖所示:

圖片

2、設置事務隔離級別

每個連接到 MySQL 的客戶端可以單獨設置事務的隔離級別,MySQL 可以使用以下 SQL 設置當前連接(客戶端)的事務隔離級別:

set session transaction isolation level 事務隔離級別;

其中事務隔離級別有 4 個值:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

3、臟讀問題

一個事務讀取到了另一個事務為提交保存的數據,之后此事務進行了回滾操作,從而導致第一個事務讀取了一個不存在的臟數據。接下來,我們使用 SQL 來演示一下臟讀問題。

正式開始之前,先創建一個測試表:

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

臟讀的執行順序如下:

圖片

臟讀的執行 SQL 和執行順序如下:

  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。

對應的執行結果如下圖所示:

圖片

? 圖片 ?從上述結果可以看出,當把客戶端 A 設置為讀未提交的事務隔離級別后,客戶端 A 可以讀取到其他事務未提交的數據,當其他事務回滾之后,客戶端 A 讀取的數據就成了臟數據,這就是臟讀,也就是讀未提交的事務隔離級別中存在臟讀的問題。

4、不可重復讀問題

在同一個事務中,同一個查詢在不同的時間得到了不同的結果。例如事務在 T1 讀取到了某一行數據,在 T2 時間重新讀取這一行時候,這一行的數據已經發生修改,所以再次讀取時得到了一個和 T1 查詢時不同的結果。

不可重復讀的執行順序如下:圖片

圖片

不可重復讀的執行 SQL 和執行順序如下:

  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。

對應執行的結果如下圖所示:

圖片

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

5、幻讀問題

同一個查詢在不同時間得到了不同的結果,這就是事務中的幻讀問題。例如,一個 SELECT 被執行了兩次,但是第二次返回了第一次沒有返回的一行,那么這一行就是一個“幻像”行。

幻讀的執行順序如下:

圖片

幻讀的執行 SQL 和執行順序如下:客戶端 A:set session transaction isolation level repeatable read; 客戶端 A:start transaction; 客戶端 A:select * from city where id<5; --查詢出1條數據 客戶端 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條數據 對應執行的結果如下圖所示:

圖片

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

總結

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

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2023-02-02 07:06:10

2022-09-27 21:14:54

Spring事務傳播機制

2022-09-19 06:16:23

事務隔離級別Spring

2022-10-09 20:52:19

事務隔離級別傳播機制

2022-01-13 06:59:40

HashMap底層面試

2022-09-05 07:06:59

BeanSpring

2022-05-18 07:43:09

Exchange交換器JUC

2018-12-19 16:46:38

MySQL事務隔離數據庫

2022-02-17 08:02:08

線程Java生命周期

2022-03-09 07:35:24

線程池線程參數

2022-07-20 07:29:55

TCPIP協議

2021-01-18 11:49:26

面試事務隔離

2021-10-19 10:10:51

MySQL事務隔離級別數據庫

2021-08-04 13:19:42

MySQL 事務隔離

2021-07-26 10:28:13

MySQL事務隔離

2024-04-26 09:17:20

MySQL事務隔離

2020-03-05 09:33:15

數據庫事務隔離事務

2024-12-02 08:37:04

2017-08-09 14:34:12

MysqlJavaPython

2023-09-12 14:56:13

MyBatis緩存機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区观看 | 欧美在线观看黄色 | 国产在线精品一区二区 | 久久国产成人 | 久久久久国产一区二区三区不卡 | 国产高清不卡 | 日本在线免费看最新的电影 | 成人在线视频免费观看 | 日韩av成人在线 | 国产精品一区在线观看 | 成人亚洲一区 | 久久噜噜噜精品国产亚洲综合 | 国产一级免费视频 | 欧美在线一区二区三区 | 精品久久久久久久久久久久久久久久久 | 精品视频 免费 | 日本特黄a级高清免费大片 特黄色一级毛片 | 成人亚洲| 久草福利 | 成人欧美 | 福利视频网| 一级做a爰片性色毛片 | 日韩欧美国产不卡 | 九九久久精品 | 久久国产精品-国产精品 | 成人亚洲在线 | 免费视频99 | 久久精品成人 | 超碰电影 | 超碰综合| 成人a视频在线观看 | 精品国产欧美一区二区三区成人 | 精品国产一区二区 | 欧美亚洲国产成人 | 欧美视频精品 | 欧美一级淫片免费视频黄 | 国产福利二区 | 欧美在线a | 亚洲狠狠 | 国产在线对白 | 欧美一区二区三区国产精品 |