mysql中的樂觀鎖和悲觀鎖

2021-09-09 05:10:08 字數 1678 閱讀 7251

mysql的悲觀鎖:

其實理解起來非常簡單,當資料被外界修改持保守態度,包括自身系統當前的其他事務,以及來自外部系統的事務處理,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制,但是也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在自身系統中實現了加鎖機制,也無法保證外部系統不會修改資料。

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

關閉命令為:set autocommit=0;

悲觀鎖可以使用select…for update實現,在執行的時候會鎖定資料,雖然會鎖定資料,但是不影響其他事務的普通查詢使用。此處說普通查詢就是平時我們用的:select * from table 語句。在我們使用悲觀鎖的時候事務中的語句例如:

//開始事務

begin;/begin work;/start transaction; (三選一)

//查詢資訊

select * from order where id=1 for update;

//修改資訊

update order set name='names';

//提交事務

commit;/commit work;(二選一)

此處的查詢語句for update關鍵字,在事務中只有select ... for update 或lock in share mode 同一條資料時會等待其它事務結束後才執行,一般的select查詢則不受影響。

執行事務時關鍵字select…for update會鎖定資料,防止其他事務更改資料。但是鎖定資料也是有規則的。

查詢條件與鎖定範圍:

1、具體的主鍵值為查詢條件

比如查詢條件為主鍵id=1等等,如果此條資料存在,則鎖定當前行資料,如果不存在,則不鎖定。

2、不具體的主鍵值為查詢條件

比如查詢條件為主鍵id>1等等,此時會鎖定整張資料表。

3、查詢條件中無主鍵

會鎖定整張資料表。

4、如果查詢條件中使用了索引為查詢條件

明確指定索引並且查到,則鎖定整條資料。如果找不到指定索引資料,則不加鎖。

悲觀鎖的確保了資料的安全性,在資料被操作的時候鎖定資料不被訪問,但是這樣會帶來很大的效能問題。因此悲觀鎖在實際開發中使用是相對比較少的。

mysql的樂觀鎖:

相對悲觀鎖而言,樂觀鎖假設資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會對資料的衝突與否進行檢測,如果發現衝突,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。

一般來說,實現樂觀鎖的方法是在資料表中增加乙個version欄位,每當資料更新的時候這個字段執行加1操作。這樣當資料更改的時候,另外乙個事務訪問此條資料進行更改的話就會操作失敗,從而避免了併發操作錯誤。當然,還可以將version欄位改為時間戳,不過原理都是一樣的。

例如有表student,字段:

id,name,version

當事務一進行更新操作:update student set name='ygz' where id = # and version = #;

此時操作完後資料會變為id = 1,name = ygz,version = 2,當另外乙個事務二同樣執行更新操作的時候,卻發現version != 1,此時事務二就會操作失敗,從而保證了資料的正確性。

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 悲觀鎖的特點是先獲取鎖,再進行業務操作,即 悲觀 的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進...