虛繼承實現原理(虛基類表指標與虛基類表)
資料庫鎖
鎖和索引是資料庫兩大核心概念,瞭解索引,可以從 B+ 樹,Hash 索引,頁結構,快取池,索引原則等方面理解。理解鎖,要從哪些方面入手?
為什麼要加鎖
加鎖的目的,其實是為了保證資料的一致性。當多個執行緒併發訪問某個資料時,加鎖,可以保證這個資料在任何時刻最多隻有一個執行緒在訪問,保證資料的完整性和一致性。
鎖的分類
鎖可以按照鎖粒度劃分,可以按照資料庫管理角度劃分。
按照鎖粒度劃分
按照鎖粒度劃分,可以將鎖劃分成 行鎖,頁鎖和表鎖。
快速回憶一遍 InnoDB 儲存引擎的邏輯結構:所有資料都被邏輯地存放在一個空間內,稱為表空間,而表空間由段(sengment)、區(extent)、頁(page)組成。
InnoDB儲存引擎的邏輯結構
- 行鎖
行鎖,就是按照行的粒度對資料進行鎖定,鎖定粒度小,發生鎖衝突概率低,可以實現併發都高,但是對於鎖的開銷比較大,加上會比較慢,容易出現死鎖的情況。
- 頁鎖
頁鎖就是頁的粒度上進行鎖定,鎖定的資料資源比行鎖要多,因為一個頁中可以有多個行記錄,當我們使用頁鎖的時候,會出現資料浪費的現象,頁鎖的開銷介於表鎖行鎖之間。
- 表鎖
表鎖就是對資料進行鎖定,鎖定粒度很大,傳送鎖的概率很高,資料訪問的併發度。不過好處在於對鎖的使用開銷小,加鎖會很快。
InnoDB 和 Oracle 支援行鎖和表鎖,MyISAM 只支援表鎖, MYSQL BDB 儲存引擎支援頁鎖和表鎖。
按照資料庫管理角度劃分
按照資料庫管理角度劃分,可以將鎖分成排他鎖和共享鎖。
1、共享鎖
共享鎖,也叫讀鎖,或者 S 鎖,共享鎖鎖定的資源可以被其他使用者讀取,但不能修改。在進行 SElECT 的時候,會將物件進行共享鎖鎖定,當資料讀取完畢之後,就會釋放共享鎖,這樣就可以保證資料在讀取時不被修改。
給某個表加共享鎖:
LOCK TABLE product_comment READ;
當資料表加上共享鎖的時候,該表資料就會變成只讀模式,當時我們想更新 product_comment 表中的資料會報錯,比如:
UPDATE product_comment SETproduct_id = 10002 WHERE user_id = 912178;
系統報錯如下:
ERROR 1099 (HY000): Table 'product_comment' was locked with a READ lock and can't be updated
如果對錶共享鎖進行解鎖:
UNLOCK TABLE;
給某行資料加共享鎖
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
例子:
SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE
2、排他鎖
排他鎖也叫做獨佔鎖,寫鎖或者 X 鎖,排他鎖鎖定的資料只允許進行鎖定操作的事務使用,其他事務無法對已鎖定的資料進行查詢或者修改。
給表加排他鎖
LOCK TABLE product_comment WRITE;
排他鎖的事務可以對 product_comment 進行查詢和修改。其他事務如果想要在 product_comment 表上查詢資料,則需要等待。
釋放掉排他鎖
UNLOCK TABLE;
資料行上新增排他鎖
SELECT * FROM table_name WHERE ... FOR UPDATE
例子:
SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 FOR UPDATE;
當我們對資料進行更新的時候會自動使用排他鎖,也就是 INSERT ,DELETE 或者 UPDATE 的時候,資料庫自動使用排他鎖,防止其他事務對改資料進行操作。
從程式設計師角度進行劃分
1、樂觀鎖
樂觀鎖認為對同一個資料併發操作不會總髮生,是小概率事件,因此不用每次對資料進行更新或者刪除。
UPDATE ... SET version=version+1 WHERE version=version
此時,如果已經有事務對這條資料進行了更新,修改就不會成功。
2、悲觀鎖
悲觀鎖(Pessimistic Locking),通過資料庫自身的鎖機制來實現,從而保證資料操作的排他性。
- 樂觀鎖適合讀操作多的場景,相對來說寫的操作⽐較少。它的優點在於程式實現,不存在死鎖問題,不過適⽤場景也會相對樂觀,因為它阻⽌不了除了程式以外的資料庫操作。
- 悲觀鎖適合寫操作多的場景,因為寫的操作具有排它性。採⽤悲觀鎖的⽅式,可以在資料庫層⾯阻⽌其他事務對該資料的操作許可權,防⽌讀-寫和寫-寫的衝突
原文出處:
王小明_HIT, 資料庫鎖, https://cloud.tencent.com/developer/article/1656169