1. 程式人生 > >mysql悲觀鎖和樂觀鎖

mysql悲觀鎖和樂觀鎖

一、悲觀鎖

1、排它鎖,當事務在操作資料時把這部分資料進行鎖定,直到操作完畢後再解鎖,其他事務操作才可操作該部分資料。這將防止其他程序讀取或修改表中的資料。

2、實現:大多數情況下依靠資料庫的鎖機制實現

 一般使用 select ...for update 對所選擇的資料進行加鎖處理,例如select * from account where name=”Max” for update, 這條sql 語句鎖定了account 表中所有符合檢索條件(name=”Max”)的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。
 
如果對“select *from student where id = 931 for update”使用了悲觀鎖,所以此時的所有該表的所有資料更新(不過我們需要注意一些鎖的級別,MySQL InnoDB預設行級鎖。行級鎖都是基於索引的,如果一條SQL語句用不到索引是不會使用行級鎖的,會使用表級鎖把整張表鎖住,這點需要注意。)操作不會寫入到資料庫。

二、樂觀鎖

1、如果有人在你之前更新了,你的更新應當是被拒絕的,可以讓使用者重新操作。

2、實現:大多數基於資料版本(Version)記錄機制實現

 具體可通過給表加一個版本號或時間戳欄位實現,當讀取資料時,將version欄位的值一同讀出,資料每更新一次,對此version值加一。當我們提交更新的時候,判斷當前版本資訊與第一次取出來的版本值大小,如果資料庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期資料,拒絕更新,讓使用者重新操作。