MySQL中的快照讀和當(dāng)前讀用法
在 MySQL 的 InnoDB 存儲引擎中,快照讀(Snapshot Read)和當(dāng)前讀(Current Read)是兩種不同的數(shù)據(jù)讀取方式,它們的主要區(qū)別在于是否加鎖以及數(shù)據(jù)一致性。
下面詳細(xì)介紹這兩種讀取方式及其應(yīng)用場景。
快照讀(Snapshot Read)
快照讀是一種非加鎖的讀取方式,它讀取的是事務(wù)開始時的數(shù)據(jù)快照。
快照讀主要用于讀取數(shù)據(jù)的一致性視圖,確保在一個事務(wù)中多次讀取同一數(shù)據(jù)時結(jié)果一致。
特點
- 非加鎖:快照讀不會對數(shù)據(jù)加鎖,因此是非阻塞的。
- 一致性視圖:讀取的是事務(wù)開始時的數(shù)據(jù)快照,不會看到其他事務(wù)在此期間對數(shù)據(jù)的更改。
- 多版本并發(fā)控制(MVCC):通過 MVCC 機制,快照讀可以訪問數(shù)據(jù)的多個版本,確保事務(wù)隔離。
應(yīng)用場景
- 讀提交(Read Committed, RC)隔離級別:每次
SELECT語句都會生成一個新的快照,讀取的是當(dāng)前已提交的數(shù)據(jù)。 - 可重復(fù)讀(Repeatable Read, RR)隔離級別:事務(wù)開始時生成一個快照,事務(wù)中的所有
SELECT語句都會使用這個快照,確保事務(wù)中多次讀取同一數(shù)據(jù)時結(jié)果一致。
示例
-- 會話 1 START TRANSACTION; SELECT * FROM t_user; -- 快照讀,讀取事務(wù)開始時的數(shù)據(jù)快照 -- 會話 2 START TRANSACTION; UPDATE t_user SET age = 35 WHERE name = 'Bob'; COMMIT; -- 會話 1 SELECT * FROM t_user; -- 快照讀,仍然讀取事務(wù)開始時的數(shù)據(jù)快照
當(dāng)前讀(Current Read)
當(dāng)前讀是一種加鎖的讀取方式,它讀取的是數(shù)據(jù)的最新版本,并且會對讀取的數(shù)據(jù)加鎖,以確保其他并發(fā)事務(wù)不能修改當(dāng)前記錄。
特點
- 加鎖:當(dāng)前讀會對讀取的數(shù)據(jù)加鎖,確保數(shù)據(jù)的一致性和完整性。
- 最新版本:讀取的是數(shù)據(jù)的最新版本,可以看到其他事務(wù)已經(jīng)提交的更改。
- 事務(wù)隔離:通過加鎖機制,確保事務(wù)的隔離性。
應(yīng)用場景
- 讀提交(Read Committed, RC)隔離級別:當(dāng)前讀會讀取最新的已提交數(shù)據(jù)。
- 可重復(fù)讀(Repeatable Read, RR)隔離級別:當(dāng)前讀會讀取最新的已提交數(shù)據(jù),并加鎖。
- 更新操作:
UPDATE、DELETE、INSERT等修改數(shù)據(jù)的操作會觸發(fā)當(dāng)前讀。 - 鎖定讀:
SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE會觸發(fā)當(dāng)前讀。
示例
-- 會話 1 START TRANSACTION; SELECT * FROM t_user WHERE name = 'Bob' FOR UPDATE; -- 當(dāng)前讀,讀取最新版本并加鎖 -- 會話 2 START TRANSACTION; UPDATE t_user SET age = 35 WHERE name = 'Bob'; -- 被會話 1 的鎖阻塞 COMMIT; -- 會話 1 UPDATE t_user SET age = 40 WHERE name = 'Bob'; -- 更新操作,讀取最新版本并加鎖 COMMIT;
總結(jié)
- 快照讀:非加鎖的讀取方式,讀取的是事務(wù)開始時的數(shù)據(jù)快照,確保事務(wù)中多次讀取同一數(shù)據(jù)時結(jié)果一致。
- 當(dāng)前讀:加鎖的讀取方式,讀取的是數(shù)據(jù)的最新版本,確保數(shù)據(jù)的一致性和完整性。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql啟動時報錯:error while loading shared li
這篇文章主要給大家介紹了解決mysql啟動時報錯:error while loading shared libraries: libncurses.so.5: cannot open shared object file的方法,需要的朋友可以參考下2023-08-08
MySQL批量替換數(shù)據(jù)庫字符集的實用方法(附詳細(xì)代碼)
當(dāng)需要修改數(shù)據(jù)庫編碼和字符集時,通常需要對其下屬的所有表及表中所有字段進(jìn)行修改,下面這篇文章主要介紹了MySQL批量替換數(shù)據(jù)庫字符集的實用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
Mysql字符串截取函數(shù)SUBSTRING的用法說明
今天建視圖時,用到了MySQL中的字符串截取,很是方便。2011-06-06

