一、當前讀的概念與應用場景
當前讀是指在事務執行期間,讀取已經提交但未被當前事務更新的數據。當前讀應用場景一般是在並發事務過程中,為了保證數據一致性,需要讀取最新的數據。
在MySQL中,InnoDB存儲引擎中的SELECT語句都是默認使用當前讀。當前讀是InnoDB存儲引擎所提供的,可以通過以下命令進行設置:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
或者在啟動MySQL的時候添加–transaction-isolation=READ-COMMITTED參數。
有些場景下需要使用當前讀,比如查詢某個用戶的餘額,此時需要獲取到最新的餘額。但是需要注意,當前讀可能導致臟數據的出現。如果在讀取數據的同時,其他事務對該數據進行了修改,那麼讀到的數據就是臟數據。
二、快照讀的概念與應用場景
快照讀是指在事務執行期間,讀取已經提交且符合當前事務隔離級別的數據的快照,而非當前數據。快照讀應用場景一般是在需要讀取歷史數據或者需要獲取數據一致性的場景下。
在MySQL中,通過使用MVCC(多版本並發控制)機制實現快照讀。不同的存儲引擎有不同實現方式。在InnoDB存儲引擎中,每個事務都有自己的事務ID(稱為事務版本號),每個數據行也有自己的版本號,版本號對應的是數據行最近一次被修改的事務ID。
在快照讀中,事務讀取過程中,只會讀取版本號小於或等於自己事務版本號的數據行,保證了數據一致性。
快照讀可以通過以下命令進行設置:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
或者在啟動MySQL的時候添加–transaction-isolation=REPEATABLE-READ參數。
三、當前讀與快照讀的對比
當前讀相比快照讀,在事務並發量較高的情況下,容易引發死鎖或者鎖競爭問題,而且容易讀取到臟數據。
快照讀則相對穩定,尤其是當對事務一致性要求很高的時候,快照讀更適合。但是快照讀也有一定的性能問題,因為在實現上,需要進行版本控制,增加了一定的額外開銷。
四、代碼示例
以下是一個使用當前讀的MySQL查詢語句:
SELECT id, name, balance FROM user WHERE id = 1 FOR UPDATE;
以下是一個使用快照讀的MySQL查詢語句:
SELECT id, name, balance FROM user WHERE id = 1;
注意,在快照讀下,如果需要對數據進行修改,需要使用SELECT…FOR UPDATE語句來獲得獨佔鎖。
原創文章,作者:VCBRN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372189.html