mysql樂觀鎖和悲觀鎖

2021-10-20 22:02:20 字數 1100 閱讀 9081

樂觀鎖是從應用系統層面進行併發控制,常用的是版本號方式和時間戳方式。

當乙個程序訪問資料時會給表增加乙個版本號字段,每進行一次更新就會加1,程序開始會獲得乙個版本號,當要update時再獲取一次版本號,進行比較,若相同則更新,不同則不更新。時間戳方式原理和前面一樣,比較的是執行緒之前取到的時間戳和更新時取到的時間戳

一般用來解決資料庫併發下的寫–寫衝突

cas思想

語句後面加 lock in share mode

悲觀鎖是從資料庫層面做併發控制,這個應該是真正意義的加鎖,分為共享鎖和排他鎖。雖然可以加共享鎖,但是mysql的update、insert、delete自動加了排他鎖 。使用悲觀鎖,需要關閉mysql的auto_commit模式

語句後面加 for update

1.myisam在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (update、delete、insert等)前,會自動給涉及的表加寫鎖。

2.mysql innodb預設行級鎖。 行級鎖都是基於索引的,如果一條sql語句用不到索引是不會使用行級鎖的,會使用表級鎖把整張表鎖住。

當前讀和快照讀的區別

當前讀

像select lock in share mode(共享鎖), select for update ; update, insert ,delete(排他鎖)這些操作都是一種當前讀,為什麼叫當前讀?就是它讀取的是記錄的最新版本,讀取時還要保證其他併發事務不能修改當前記錄,會對讀取的記錄進行加鎖

快照讀

像不加鎖的select操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級別不是序列級別,序列級別下的快照讀會退化成當前讀;之所以出現快照讀的情況,是基於提高併發效能的考慮,快照讀的實現是基於多版本併發控制,即mvcc,可以認為mvcc是行鎖的乙個變種,但它在很多情況下,避免了加鎖操作,降低了開銷;既然是基於多版本,即快照讀可能讀到的並不一定是資料的最新版本,而有可能是之前的歷史版本

參考

MySQL 樂觀鎖和悲觀鎖

共享鎖 s鎖 又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。排他鎖 x鎖 又稱寫鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其...

Mysql 樂觀鎖和悲觀鎖

假定每次操作都不會產生衝突,一般使用cas進行解決。update set num num 1 where num and name 假定每次操作都會衝突,都需要加鎖解決。select for update 結果集中的任何行資料使用排他鎖或共享鎖,否則申請會阻塞for update僅適用於innodb...

mysql 樂觀鎖和悲觀鎖

悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發程式設計中乙個非常基礎的概念。本文將對這兩種常見的鎖機制在資料庫資料上的實現進行比較系統的介紹。悲觀鎖 pessimistic lock 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...