1. 程式人生 > 實用技巧 >虛繼承實現原理(虛基類表指標與虛基類表)

虛繼承實現原理(虛基類表指標與虛基類表)

資料庫鎖

鎖和索引是資料庫兩大核心概念,瞭解索引,可以從 B+ 樹,Hash 索引,頁結構,快取池,索引原則等方面理解。理解鎖,要從哪些方面入手?

為什麼要加鎖

加鎖的目的,其實是為了保證資料的一致性。當多個執行緒併發訪問某個資料時,加鎖,可以保證這個資料在任何時刻最多隻有一個執行緒在訪問,保證資料的完整性和一致性。

鎖的分類

鎖可以按照鎖粒度劃分,可以按照資料庫管理角度劃分。

按照鎖粒度劃分

按照鎖粒度劃分,可以將鎖劃分成 行鎖,頁鎖和表鎖。

快速回憶一遍 InnoDB 儲存引擎的邏輯結構:所有資料都被邏輯地存放在一個空間內,稱為表空間,而表空間由段(sengment)、區(extent)、頁(page)組成。

InnoDB儲存引擎的邏輯結構

  1. 行鎖

行鎖,就是按照行的粒度對資料進行鎖定,鎖定粒度小,發生鎖衝突概率低,可以實現併發都高,但是對於鎖的開銷比較大,加上會比較慢,容易出現死鎖的情況。

  1. 頁鎖

頁鎖就是頁的粒度上進行鎖定,鎖定的資料資源比行鎖要多,因為一個頁中可以有多個行記錄,當我們使用頁鎖的時候,會出現資料浪費的現象,頁鎖的開銷介於表鎖行鎖之間。

  1. 表鎖

表鎖就是對資料進行鎖定,鎖定粒度很大,傳送鎖的概率很高,資料訪問的併發度。不過好處在於對鎖的使用開銷小,加鎖會很快。

InnoDB 和 Oracle 支援行鎖和表鎖,MyISAM 只支援表鎖, MYSQL BDB 儲存引擎支援頁鎖和表鎖。

SQL Server 可以支援行鎖,頁鎖和表鎖。

按照資料庫管理角度劃分

按照資料庫管理角度劃分,可以將鎖分成排他鎖和共享鎖。

1、共享鎖

共享鎖,也叫讀鎖,或者 S 鎖,共享鎖鎖定的資源可以被其他使用者讀取,但不能修改。在進行 SElECT 的時候,會將物件進行共享鎖鎖定,當資料讀取完畢之後,就會釋放共享鎖,這樣就可以保證資料在讀取時不被修改。

給某個表加共享鎖:

LOCK TABLE product_comment READ;

當資料表加上共享鎖的時候,該表資料就會變成只讀模式,當時我們想更新 product_comment 表中的資料會報錯,比如:

UPDATE product_comment SET
product_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