歡迎光臨
每天分享高質量文章

漫話:如何給女朋友解釋什麼是共享鎖和排他鎖

來自:漫話編程(微信號:mhcoding)

周末,我正在看電視劇,是那個小說改編的《鬥破蒼穹》,看的正嗨的時候,女朋友氣哄哄的走過來。

我不喜歡蕭炎,太花心,有那麼多老婆。

哈哈,喜歡蕭炎的妹子給他加的是共享鎖,而不是排他鎖。

我看她們共享的是挺開心的,心真大。

這個共享不是你說的意思啦。

共享鎖,又稱為讀鎖,獲得共享鎖之後,可以查看但無法修改和刪除資料。

排他鎖,又稱為寫鎖、獨占鎖。獲准排他鎖後,既能讀資料,又能修改資料。

你又跟我拽概念了。我完全聽不懂啊。

你別急,我給你介紹一下你就知道啦。

為什麼要加鎖

很多人都知道,鎖,是用來解決併發問題的,那麼什麼是併發問題呢?併發情況下,不加鎖會有什麼問題呢?

拿日常生活中的洗手間舉例子,每個洗手間都會有一個門,並且是可以上鎖的,當我們進入洗手間之後會把門反鎖,當我們出來之後再把鎖打開。

當門被鎖上的時候,其他人只能在門外等待。洗手間之所以要有門鎖,就是為了保護隱私的,避免出現多個人同時進入洗手間的情況。

這和資料庫中的鎖其實是一樣的,為了避免多個事務同時運算元據庫導致資料異常,一般會通過鎖機制解決。

奧,我懂了,加鎖是為了避免併發導致資料出現異常

嗯嗯,是的。

那共享鎖和排他鎖呢?有啥區別

別急,慢慢來。

在介紹共享鎖和排他鎖之前,我們先來打個比喻。前面已經用了一個洗手間的例子,那麼就繼續這個例子,我們拓展一下。

一般情況下,我們進入洗手間有可能做以下幾件事兒:洗手、化妝、上廁所等。其實只有上廁所這件事兒是極度隱私的,而其他幾件事兒並沒有那麼隱私。

我們可以認為洗手間就是一個資料庫表,而洗手間內部的設施就是資料庫表中的資料。

我們每個想要進入洗手間的人都是一個事務。

簡單的洗手、化妝等操作可以認為是讀操作。而上廁所操作我們認為他是寫操作。

共享鎖

前面簡單介紹了資料庫與洗手間之間的類比關係,那麼接下來繼續分析什麼是共享鎖。

有些時候,如果我們進入洗手間只是想洗手的話,我們一般不會鎖門。而其他人也可以進來洗手、化妝等。但是,其他人是不可以進來上廁所的。

這就是共享鎖,也叫讀鎖。就是我們對資料進行讀取操作的時候,其實是不會改變資料的值的。

所以我們可以給資料庫增加讀鎖,獲得讀鎖的事務就可以讀取資料了。當資料庫已經被別人增加了讀鎖的時候,其他新來的事務也可以讀資料,但是不能寫。

也就是說,如果事務T對資料A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。

用法

在查詢陳述句後面增加LOCK IN SHARE MODE,Mysql會對查詢結果中的每行都加共享鎖。

SELECT ... LOCK IN SHARE MODE;

當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他執行緒也可以讀取使用了共享鎖的表,而且這些執行緒讀取的是同一個版本的資料。

我明白了什麼是共享鎖了。那排他鎖呢?

聽我慢慢道來。

排他鎖

介紹完了共享鎖後,在來說說互斥鎖。

如果我們進入洗手間只是想洗手,那麼我們可以允許其他人也進來洗手。但是,如果我們進入洗手間是為了上廁所,那麼任何人不能再進來做任何事。

這就是排他鎖,也叫寫鎖。就是我們對資料進行寫操作的時候,要先獲得寫鎖,獲得寫鎖的事務既可以寫資料也可以讀資料。當時,如果資料庫已經被別人增加了排他寫鎖,那麼後面的事務是無法在獲得該資料庫的任何鎖的。

也就是說,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。

用法

在查詢陳述句後面增加FOR UPDATE,Mysql會對查詢結果中的每行都加排他鎖

SELECT ... FOR UPDATE;

當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。

你這個獲得排他鎖的例子為什麼是個讀操作呢?

因為寫操作會被預設增加排他鎖,不需要顯示宣告啊。

哇,原來資料庫這麼智慧。

當然了,這樣才能更好的保證資料安全呀。

加鎖原則

拿MySql的InnoDB引擎來說,對於insertupdatedelete等操作。會自動給涉及的資料加排他鎖;

對於一般的select陳述句,InnoDB不會加任何鎖,事務可以通過以下陳述句給顯示加共享鎖或排他鎖。

共享鎖:SELECT ... LOCK IN SHARE MODE;

排他鎖:SELECT ... FOR UPDATE;

就這樣,我給他講完了樂觀鎖和排他鎖,然後想著終於可以繼續去看電視劇了。

你已經被我加上排他鎖了,你別想美事兒了了。

額(⊙o⊙)…


編號808,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂