上節回顧
上兩篇記錄了我對MySQL 事務 隔離級別** read uncommitted **、MySQL 事務隔離級別 read committed+MVCC 的理解。
這篇記錄我對 Repeatable Read 的理解。
前言
MySQL在 read committed、**Repeatable 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 存儲引擎會去讀取行的一個快照數據。
博客搬家:大坤的個人博客
歡迎評論哦~