MySQL中的樂觀鎖與悲觀鎖

2021-09-11 16:05:53 字數 1039 閱讀 5265

在併發控制程式設計中是乙個非常重要的概念,鎖對於資料和業務一致性的保證起到關鍵作用,鎖可以是程式層面的,也可以是資料庫層面的,今天本文就通過mysql來說明悲觀鎖樂觀鎖兩種常見的鎖機制。

悲觀鎖

悲觀鎖(pessimistic lock)的特點是先獲取鎖,在進行資料操作,最後釋放鎖。即先鎖後查再更新,使用悲觀鎖的「悲觀」的認為是這種獲取鎖的的可能是非常小的,因而需要確保獲取到鎖後再進行操作。這種操作在mysql中的典型例子就是「select * from goods where id=5 for update」。但是在這種操作下,需要考慮以下情況。

樂觀鎖樂觀鎖(optimistic lock)的特點先進行業務操作,不到萬不得已不去拿鎖。即「樂觀」的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新資料的最後一步再去拿一下鎖就好。

/*獲取id等於20的行的訂單編號和行版本號並通過版本號更新記錄*/

$this->trans_begin();//開啟事務

$order = $this->get("select order_sn,version from order_info where id=20")

$result = $this->query("update order_info set data = 『$new_data』, version='$new_data' where version=$version")

if ($result > 0) else

通過上述例子可以看到,樂觀鎖在原有資料沒有改變的基礎上(版本號沒有發生改變)操作成功,改變了回滾進行重試或者其他操作。樂觀鎖一般需要通過正確的去維護乙個版本號欄位來進行併發控制。

總結在取鎖的失敗率比較低的情況下樂觀鎖的開銷是較小了,反而取鎖失敗過高導致事務回滾的開銷就比較大。悲觀鎖在取鎖概率較小和業務不是非常複雜的系統中用的還是比較普遍。

MySql中的樂觀鎖與悲觀鎖

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

MySQL 中的樂觀鎖與悲觀鎖

為什麼需要鎖 在併發環境下,如果多個客戶端訪問同一條資料,此時就會產生資料不一致的問題,如何解決,通過加鎖的機制,常見的有兩種鎖,樂觀鎖和悲觀鎖,可以在一定程度上解決併發訪問。樂觀鎖樂觀鎖,顧名思義,對加鎖持有一種樂觀的態度,即先進行業務操作,不到最後一步不進行加鎖,樂觀 的認為加鎖一定會成功的,在...

mysql悲觀鎖與樂觀鎖

pessimistic locking 樂觀併發控制 樂觀鎖 和悲觀併發控制 悲觀鎖 是併發控制主要採用的技術手段。悲觀鎖還是樂觀鎖,都是人們定義出來的概念,是一種思想。對於資料庫 悲觀鎖 在資料處理過程,將資料處於鎖定狀態,一般使用資料庫的鎖機制實現。從廣義上來講,前面提到的行鎖 表鎖 讀鎖 寫鎖...