漫談資料庫鎖

2021-07-01 22:02:40 字數 2340 閱讀 4632

()函式獲取鎖導致的一些問題,主要有兩類問題:

1

、乙個連線中不能同時獲取兩把鎖,因為獲取後乙個的時候會自動釋放前面一把鎖;另外如果獲得鎖或者釋放鎖所使用的connection不一樣,假如獲得鎖的connection被連線池**了,也可能會導致第一把鎖自動釋放,最終導致你的業務還沒有處理完,別人也同時處理相同的業務,最終導致業務的不一致。

2

、為了解決第乙個問題,很多同學把獲得鎖和釋放鎖放在乙個事務當中,在獲得鎖和釋放鎖中間做了大量的耗時的業務邏輯(甚至這些業務邏輯根本就沒有涉及到資料庫操作),例如呼叫了幾個外部系統的tr服務,或者批量處理功能;導致乙個連線被占用過長時間,假如併發量一大,不但會導致介面效能下降,還會導致資料庫連線不夠,直接導致系統大面積癱瘓,非常危險。

以下是mysql官方文件對get_lock()

函式的詳細說明,如果大家仔細並研究過這個函式,我相信大家一定不會輕易使用get_lock()的場景。

加鎖:"selectget_lock('', ) as get_lock";

解鎖:"selectrelease_lock('') as release_lock";

設法使用字串str

給定的名字得到乙個鎖, 超時為timeout 秒。若成功得到鎖,則返回 1,若操作超時則返回0 (例如,由於另乙個客戶端已提前封鎖了這個名字 ),若發生錯誤則返回null (諸如缺乏記憶或執行緒mysqladmin kill被斷開 )。假如你有乙個用get_lock()得到的鎖,當你執行release_lock()或你的連線斷開(正常或非正常)時,這個鎖就會解除。

mysql>select get_lock('lock1',10);

-> 1

mysql>select is_free_lock('lock2');

-> 1

mysql>select get_lock('lock2',10);

-> 1

mysql>select release_lock('lock2');

-> 1

mysql>select release_lock('lock1');

-> null

注意,第二個 release_lock()呼叫返回 null ,原因是鎖'lock1' 被第二個get_lock()呼叫解開。

mysql

的get_lock()函式除了上面的那個問題之外,還會存在以下問題:

所以為了解決這些問題我們必須採用其他的解決方案,目前主要有兩種解決方案: 1

、採用其他類似memcached之類的全域性快取鎖

2、採用cas思想的基於資料庫的樂觀鎖,但不需要依賴資料庫型別

但有時候,並不是所有的系統都需要tair或者memcached之類的快取,如果僅僅為了鎖而申請快取,從而導致系統嚴重依賴了乙個外部環境,所以並不經濟划算,所以下面主要著重介紹第二種方案。

其實我們可以為每個庫設計一張非常簡單的表,例如表名叫做lock:

name

version

gmt_modified

lock1 0

2015-04-19 00:00:00

表的結構非常簡單,只有兩列屬性,一列代表鎖的名稱,一列代表鎖當前的狀態。

假如我們要獲取鎖,只需要執行一條update lock set version=1 where name='lock1' and version=0,如果執行成功表示獲得鎖成功,否則表示獲得鎖失敗;同樣我們要釋放鎖,我們只需要執行一條update lock set version=0 where name='lock1' and version=1,如果執行成功表示釋放鎖成功,否則表示釋放鎖失敗。

在獲取鎖和釋放鎖的時候不需要求在同乙個事務裡面,也不需要是同乙個連線,也不會出現獲取另外一把鎖同時會自動釋放前面一把鎖,你可以在獲得鎖和釋放鎖中間做大量的業務邏輯操作,不會導致占用資料連線過長時間,並且也沒有強依賴資料庫型別,以後做資料庫遷移也不用改**;並且lock也不會太多條資料,耗時基本上在毫秒級,效能上也得到了保證。

當然,這種方案可能會出現系統發布或者其他異常情況下導致獲得鎖和釋放鎖中間斷開,從而導致一直無法釋放鎖,但是如果我們能夠做好補償機制,例如獲得鎖不成功的次數超過一定量,我們自動釋放鎖;或者鎖占用的時間超過了一定的時間,我們自動釋放鎖;或者監控報警,然後人工處理等等;這些補償方案也能夠達到我們的預期。

漫談資料庫

談到資料庫這個詞,我想無論是菜鳥還是高手都不會感到陌生。隨著資訊化時代的到來,資料庫已被廣泛運用於各類電腦網路和管理系統中。如果沒有資料庫的話,今天的網際網路就不會這樣 絢麗多姿 我們所看到的企業管理系統將只能成為一種電腦的裝飾品。我有不少朋友,雖然他們對資料庫各有自己的看法,但在有一點上是達成共識...

資料庫(2)資料庫鎖

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。二.事物隔離等級和鎖的關係 網上很多部落格都是直接說了一連串的鎖,什麼悲觀鎖樂觀鎖,什麼讀寫鎖,什麼排他鎖共享鎖。說的不僅語焉不詳,而且分類紊亂,希望看到這篇文章能幫助你理清思路。從鎖的實現方式來看,鎖可以分為悲觀鎖和...

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...