Mysql中的讀鎖,寫鎖,樂觀鎖及事務隔離級別和並發問題


mysql讀鎖,寫鎖,樂觀鎖

讀鎖,也叫共享鎖(shared lock)

SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE  

 

寫鎖,也叫排他鎖(exclusive lock)

SELECT * FROM table_name WHERE ... FOR UPDATE

 

樂觀鎖,是一種邏輯鎖,通過數據的版本號(vesion)的機制來實現

update t_goods
set status=2,version=version+1
where id=#{id} and version < #{version}; // 更新前將version自增

 

讀鎖、寫鎖屬於行級鎖。即事務1 對商品A 獲取寫鎖,和事務2 對商品B 獲取寫鎖互相不會阻塞的。需要我們注意的是我們的SQL要合理使用索引,當我們的SQL 全表掃描的時候,行級鎖會變成表鎖,如果where條件中只用到主鍵或者唯一索引,則加的是行鎖;否則加的是表鎖

lock in share mode適用於兩張表存在業務關系時的一致性要求, for  update適用於操作同一張表時的一致性要求

 

mqslq事務隔離級別和並發問題

1、臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據

2、不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果不一致。

3、幻讀:系統管理員A將數據庫中所有學生的成績根據具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束后發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重於修改,幻讀側重於新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

 

mysql默認隔離級別是可重復讀

select @@global.tx_isolation

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM