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