資料庫中的共享鎖與排他鎖

2022-06-24 14:06:13 字數 3619 閱讀 8727

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

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

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

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

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

在介紹共享鎖和排他鎖之前,我們先來大個比方,前面已經用了乙個洗手間的例子,那麼就繼續這個例子。一般情況下,我們進入洗手間有可能做一下幾件事:洗手、化妝、上廁所等,其實只要上廁所這件事是極度隱私的,而其他事沒有那麼隱私。

我們可以認為洗手間就是乙個資料庫表,而洗手間內部的設施就是資料庫表中的資料。我們每個想要進入洗手間的人都是乙個事務,簡單的洗手、化妝等操作可以認為是讀操作,而上廁所操作可以認為是寫操作。

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

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

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

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

也就是說,如果事務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;

內容來自:

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

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

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

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

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

在介紹共享鎖和排他鎖之前,我們先來大個比方,前面已經用了乙個洗手間的例子,那麼就繼續這個例子。一般情況下,我們進入洗手間有可能做一下幾件事:洗手、化妝、上廁所等,其實只要上廁所這件事是極度隱私的,而其他事沒有那麼隱私。

我們可以認為洗手間就是乙個資料庫表,而洗手間內部的設施就是資料庫表中的資料。我們每個想要進入洗手間的人都是乙個事務,簡單的洗手、化妝等操作可以認為是讀操作,而上廁所操作可以認為是寫操作。

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

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

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

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

也就是說,如果事務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;

內容來自:

資料庫中的共享鎖和排他鎖

共享鎖 如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。排他鎖 如果事務t對資料a加上排他鎖後,則其他事務不能再對a加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。1 執行select語句時可以獲得共享鎖。oracl...

共享鎖與排他鎖

共享鎖 s鎖 如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務職能讀取資料,不能修改資料。排他鎖 x鎖 如果事務t對資料a加上排他鎖後,則其他事務不能在對a加任何型別的封鎖。獲准排他鎖的事務既能讀取資料,也能修改資料。資料庫死鎖的原因 若干事務相互等待對方...

mysql排他鎖 mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...