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é)果一致。
特點(diǎn)
- 非加鎖:快照讀不會對數(shù)據(jù)加鎖,因此是非阻塞的。
- 一致性視圖:讀取的是事務(wù)開始時的數(shù)據(jù)快照,不會看到其他事務(wù)在此期間對數(shù)據(jù)的更改。
- 多版本并發(fā)控制(MVCC):通過 MVCC 機(jī)制,快照讀可以訪問數(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)前記錄。
特點(diǎn)
- 加鎖:當(dāng)前讀會對讀取的數(shù)據(jù)加鎖,確保數(shù)據(jù)的一致性和完整性。
- 最新版本:讀取的是數(shù)據(jù)的最新版本,可以看到其他事務(wù)已經(jīng)提交的更改。
- 事務(wù)隔離:通過加鎖機(jī)制,確保事務(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中max_connections與max_user_connections的區(qū)別
本篇文章是對mysql中max_connections與max_user_connections的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Ubuntu 20.04 安裝和配置MySql5.7的詳細(xì)教程
這篇文章主要介紹了Ubuntu 20.04 安裝和配置MySql5.7的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
mysql數(shù)據(jù)庫數(shù)據(jù)批量插入的實(shí)現(xiàn)
本文介紹了在MySQL數(shù)據(jù)庫中進(jìn)行數(shù)據(jù)批量插入和性能測試的方法,包括使用Navicat批量插入數(shù)據(jù)、編寫SQL測試、索引的創(chuàng)建和使用、查詢測試以及提升SQL性能的優(yōu)化方法,感興趣的可以參考一下2024-11-11
mysql啟動時出現(xiàn)ERROR 2003 (HY000)問題的解決方法
這篇文章主要為大家詳細(xì)介紹了mysql啟動時出現(xiàn)ERROR 2003 (HY000問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03

