MySQL資料庫事務各隔離級別加鎖情況--Repeatable Rea

ciscopuke發表於2021-09-09

上節回顧


上兩篇記錄了我對MySQL 事務 隔離級別 、MySQL 事務隔離級別 的理解。
這篇記錄我對 Repeatable Read 的理解。

前言


MySQL在 read committedRepeatable Read 兩個級別下都會使用到MVCC, 並且只在這兩個級別下使用。

目錄


1.單純加鎖是怎麼實現 Repeatable Read 的?
2.真實的情況是什麼樣子的?

1.單純加鎖是怎麼實現 Repeatable Read 的


1.多執行緒同時更新同一條記錄,加X鎖。所以併發場景下的 update 是序列執行的。
2.工業定義上的 select 一條記錄,這個時候會在記錄上加讀共享鎖(S鎖),併到事務結束,因為在這種情況下才能實現記錄在事務時間跨度上的可重複讀。在讀的時候不允許其他事務修改這條記錄。
3.update 一條語句,這個時候會在記錄上加行級排他鎖(X鎖),併到事務結束,這中場景下,其他讀事務會被阻塞。

2.真實的情況是什麼樣子的?


讀不影響寫,寫不影響讀。

1.讀不影響寫:事務以排他鎖的形式修改原始資料,讀時不加鎖,因為 MySQL 在事務隔離級別Read committed 、Repeatable Read下,InnoDB 儲存引擎採用非鎖定性一致讀--即讀取不佔用和等待表上的鎖。即採用的是MVCC中一致性非鎖定讀模式。因讀時不加鎖,所以不會阻塞其他事物在相同記錄上加 X鎖來更改這行記錄。
2.寫不影響讀:事務以排他鎖的形式修改原始資料,當讀取的行正在執行 delete 或者 update 操作,這時讀取操作不會因此去等待行上鎖的釋放。相反地,InnoDB 儲存引擎會去讀取行的一個快照資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2798577/,如需轉載,請註明出處,否則將追究法律責任。

相關文章