表鎖和行鎖互相之間的關係以及互斥規則是什麼呢?

2021-10-22 20:11:59 字數 1238 閱讀 2883

mysql的表鎖,其實是極為雞肋的乙個東西,幾乎一般很少會用到,表鎖分為兩種,一種就是表鎖,一種是表級的意向鎖。

首先說表鎖,這個表鎖,可以用如下語法來加:

lock tables *** read:這是加表級共享鎖

lock tables *** write:這是加表級獨佔鎖

一般來講,幾乎沒人會用這兩個語法去加表鎖,這不是純屬沒事兒找事兒麼,所以才說表鎖特別的雞肋。

還有就是有另外兩個情況會加表級鎖。如果有事務在表裡執行增刪改操作,那在行級會加獨佔鎖,此時其實同時會在表級加乙個意向獨佔鎖;如果有事務在表裡執行查詢操作,那麼會在表級加乙個意向共享鎖。運算元據庫,比較常見的兩種表鎖,反而是更新和查詢操作加的意向獨佔鎖和意向共享鎖,但是這個意向獨佔鎖和意向共享鎖,暫時可以當他是透明的就可以了,因為兩種意向鎖根本不會互斥。

為啥呢?因為假設有乙個事務要在表裡更新id=10的一行資料,在表上加了乙個意向獨佔鎖,此時另外乙個事務要在表裡更新id=20的一行資料,也會在表上加乙個意向獨佔鎖,你覺得這兩把鎖應該互斥嗎?明顯是不應該互斥的啊,因為它們倆更新的都是表裡不同的資料,你讓它們倆在表上加的意向獨佔鎖互斥幹什麼呢?所以意向鎖之間是根本不會互斥的。

假設乙個事務要更新表裡的資料,在表級加了乙個意向獨佔鎖,另外乙個事務要在表裡讀取資料,在表級加了乙個意向共享鎖,此時你覺得表級的意向獨佔鎖和意向共享鎖應該互斥嗎?當然不應該了!乙個人要更新資料,乙個人要讀取資料,倆人在表上加的意向鎖,憑什麼要互斥?沒天理啊!

這個所謂的表級的意向獨佔鎖和意向共享鎖,似乎是跟脫了褲子放屁一樣,多此一舉?

手動加表級共享鎖和獨佔鎖,以及更新和查詢的時候自動在表級加的意向共享鎖和意向獨佔鎖,它們之間反而是有一定的互斥關係,關係如下表所示:

仔細看一下,上面說的是在表上面手動加的獨佔鎖和共享鎖,以及更新資料和查詢資料預設自動加的意向獨佔鎖和意向共享鎖,它們互相之間的互斥關係,一看就明白了。

其實更新資料自動加的表級意向獨佔鎖,會跟你用 lock tables *** write 手動加的表級獨佔鎖是互斥的,所以說,假設你手動加了表級獨佔鎖,此時任何人都不能執行更新操作了!或者你用lock tables *** read手動加了表級共享鎖,此時任何人也不能執行更新操作了,因為更新就要加意向獨佔鎖,此時是跟你手動加的表級共享鎖,是互斥的!

如果手動加了表級的共享鎖或者獨佔鎖,此時是會阻塞掉其它事務的一些正常的讀寫操作的,因為跟它們自動加的意向鎖都是互斥的。

MySQL 全域性鎖 表鎖以及行鎖

mysql 5.7.25 ubuntu 16.04 全域性鎖即對整個資料庫例項加鎖,使得整個庫處於唯讀狀態,會阻塞dml和ddl語句。使用如下命令 簡稱ftwrl 可為資料庫加全域性鎖 flush tables with read lock 釋放全域性鎖命令如下 unlock tables 此外,在...

全域性鎖 表鎖和行鎖

全域性鎖就是對整個資料庫例項加鎖,mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock。讓你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 a 資料更新語句 b 資料定義語句 c 更新類事務的提交語句 mysql裡面...

mysql行鎖表鎖區別 mysql表鎖和行鎖區別

一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...