mysql的樂觀鎖與悲觀鎖

2022-09-16 07:18:09 字數 1536 閱讀 3336

總是認為不會產生併發問題,每次去取資料的時候總認為不會有其他執行緒對資料進行修改,因此不會上鎖,但是在更新時會判斷其他執行緒在這之前有沒有對資料進行修改,一般會使用版本號機制或cas操作實現。

例如:有這樣乙個表:

每次更新時update在條件後再附加乙個時間為條件:

update user_info set password='somelog' where username='somelog' and time='2018-07-11';
因為如果併發操作,同一刻查詢的時間一樣,但是先插入時將時間更改,那麼後更新的操作就不能進行,因為time的值被前乙個操作更改了。

這就是樂觀鎖的實現原理,更新時附加乙個版本號。

總是假設最壞的情況,每次取資料時都認為其他執行緒會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他執行緒想要訪問資料時,都需要阻塞掛起。可以依靠資料庫實現,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在j**a中,synchronized的思想也是悲觀鎖。

注:要使用資料庫的悲觀鎖,我們必須關閉mysql資料庫的自動提交屬性,因為mysql預設使用autocommit模式,也就是說,當你執行乙個更新操作後,mysql會立刻將結果進行提交。

悲觀鎖分為兩種:共享鎖和排它鎖

共享鎖是其它事務可以讀但是不能寫

排他鎖是只有自己得事務有許可權對此資料進行讀寫

sql寫法

共享鎖(s):

select * from table_name where ... lock in share mode;
排他鎖(x):

select * from table_name where ... for update;
加鎖必須先開啟事務:begin;(開啟事務)->加鎖、操作->commit;(提交事務,歸還鎖)

加鎖分為顯式加鎖與隱式加鎖,上面的寫法是顯式加鎖。mysql在執行insert、update會自動加鎖,mysql對select卻不會加鎖。

例如:不加鎖

select * from data where username=『somelog』;
加排它鎖:

select * from data where username=『somelog』 for update;
如果乙個事務加了排它鎖之後,另外乙個事務不加鎖的select也可以查詢到資料

以上可以看出,鎖不是針對事務的,排它鎖只有一把,誰拿了誰就可以進行更新,但是沒有拿到鎖的事務只要在select不加上排它鎖也可以查詢到資料。

mysql悲觀鎖與樂觀鎖

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

MySQL 悲觀鎖 樂觀鎖

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

MySQL 悲觀鎖 樂觀鎖

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