文章目錄
一、樂觀鎖(optimistic lock)
二、悲觀鎖(pessimistic lock)
三、共享鎖(share lock)
四、排他鎖(exclusive lock)
五、行鎖
六、表鎖
七、資料庫隔離級別的實現
1、read uncommitted(讀未提交的資料)
2、read committed(讀已提交的資料)
3、repeatable read(重複讀-mysql預設隔離級別)
4、serializable(序列化)
一、樂觀鎖(optimistic lock)
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖(因為不擔心資料被修改),但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫操作。
【note】:
比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。
二、悲觀鎖(pessimistic lock)
每次獲取資料的時候,都會擔心資料被修改,所以每次獲取資料的時候都會進行加鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。
【note】:
比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。
三、共享鎖(share lock)
共享鎖也叫s鎖,是一種讀鎖,當乙個事務獲得了一條資料的共享鎖,其它事務也能獲得該共享鎖,但不能獲得排他鎖,表明其它事務可讀。在執行語句後面加上lock in share mode就代表對某些資源加上共享鎖了。
排他鎖也叫x鎖,是一種寫鎖,當乙個事務對臨界區加上排他鎖,其它事務就不能獲得該臨界區的任何鎖(共享鎖,排他鎖)。
【note】:
排他鎖保證只能乙個人去處理資料,其他人不能讀也不能寫。
五、行鎖
行鎖,由字面意思理解,就是給某一行加上鎖,也就是一條記錄加上鎖。
六、表鎖
表鎖,和行鎖相對應,給這個表加上鎖。
七、資料庫隔離級別的實現
1、read uncommitted(讀未提交的資料)
現象:不會丟失資料,事務1還未提交的修改能被事務2讀取,可以讀到沒有提交或者回滾的內容 (髒資料)。
原理:寫資料時加上排他鎖,直到事務結束, 讀的時候不加鎖。
2、read committed(讀已提交的資料)
現象:能避免「丟失資料」和「髒資料」,事務1能讀到其他已提交事務的修改,出現「不可重複讀」的問題。
原理:寫資料的時候加上排他鎖, 直到事務結束,讀的時候加上共享鎖,讀完資料立刻釋放。
3、repeatable read(重複讀-mysql預設隔離級別)
現象:能避免「丟失資料」和「髒資料」, 「不可重複讀」三個問題,事務1能讀取到其他事務新插入讀資料,出現「幻讀」的問題。
原理:寫資料的時候加上排他鎖,直到事務結束, 讀資料的時候加共享鎖, 事務提交之後立刻釋放該共享鎖。
4、serializable(序列化)
現象:能避免「丟失資料」和「髒資料」, 「不可重複讀」,「幻讀」四個問題。
原理:事務讀資料則加表級共享鎖,事務寫資料則加表級排他鎖。
MySQL的各種鎖
每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖 因為不擔心資料被修改 但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫...
mysql 的各種鎖
一 樂觀鎖 optimistic lock 每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可...
MySQL 各種鎖的概念
樂觀鎖大多是基於資料版本記錄機制實現,一般是給資料庫表增加乙個 version 字段。讀取資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。比如下單操作...