回顧 MySQL鎖原理的初步理解

2021-10-19 21:31:28 字數 1314 閱讀 3665

(1)一般myisam引擎會加表鎖,進行查詢的時候,會預設加個表共享鎖,也就是表讀鎖,這個時候別的資料庫連線只能到該表來查資料,不能寫資料;

在進行寫操作的時候,myisam引擎會加個表的獨佔鎖,也就是表寫鎖,別的連線不能讀也不能寫;

myisam這樣的頁級鎖,一般很少用了。

(2)innodb引擎一般使用行鎖,有共享鎖和排他鎖兩種,

共享鎖:多個事務都可以加共享鎖讀同一行資料,但是別的事務不能寫這行資料;

排他鎖:只有乙個事務可以寫這行資料,別的事務只能讀,不能寫;

對於insert,update,delete語句,innodb會自動給要操作的記錄加上行級排他鎖;

對於select語句,innodb引擎不會去加鎖,而是預設實現了可重複讀的事務隔離級別,通過mvcc機制,多個事務在讀取乙個資料時,不會發生衝突,各個事務只讀取自己儲存的快照就行了;

手動加共享鎖的方式:

select * from table where id=

1 lock in share mode;

手動加排他鎖的方式:

select * from table where id=

1for update;

總而言之,如果有事務在修改資料,innodb會加上乙個排他鎖,不同的事務修改不同的行時,會去拿不同行的行級排他鎖;

如果有事務在讀資料,則只需要去查詢事務開啟之前那行資料的某個版本就行了,走的是mvcc的機制;

1、悲觀鎖:作業系統認為,如果不嚴格同步執行緒呼叫,則一定會產生異常。互斥鎖會將資源鎖定,只供乙個執行緒呼叫,阻塞其他執行緒;

缺點:一些情況下,大部分操作可能都是讀操作,就沒有必要每次呼叫都鎖定資源;或者同步**塊執行的耗時遠遠小於執行緒切換的耗時;

2、樂觀鎖:不會鎖定資源,當執行緒需要修改共享資源的物件時,總是會樂觀地認為狀態值沒有被其他執行緒修改過,自己主動去嘗試比較狀態值。樂觀鎖可以通過資料的版本來進行控制的,在修改之前先儲存乙份快照,正是修改時再去判斷一次這個資料有沒有被改動過;

樂觀鎖實際上並沒有用到鎖,而是一種無鎖的同步機制。

事務a對id=1的這一行加了排他鎖:

select * from table where id=

1for update;

事務b對id=2的這一行加了排他鎖:

select * from table where id=

2for update;

假設此時事務a又去嘗試對id=2的這一行進行加鎖,事務b也去嘗試對id=1的這一行進行加鎖,則兩個事務則在互相等待,出現死鎖的情況。

回顧 HTTPS工作原理的簡單理解

http協議都是明文的,是沒有加密的,風險比較大。現在大部分應用都是用https協議的 之前是基於ssl協議對http進行加密,後來又公升級到了tsl協議來加密。1 瀏覽器把自己支援的加密規則傳送給 2 從這套加密規則裡選出來一套加密演算法和hash演算法,然後把自己的身份資訊用證書的方式發回給瀏覽...

理解mysql鎖(1)鎖的概述

相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...

理解mysql鎖(1)鎖的概述

相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...