色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql查詢的阻塞,軟件上的鎖叫什么

老白2年前22瀏覽0評論
mysql查詢的阻塞,軟件上的鎖叫什么?

鎖”做一個匯總介紹。

自旋鎖

是指當一個線程在獲取鎖的時候,如果鎖已經被其它線程獲取,那么該線程將循環等待,然后不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出循環。

如果別的線程長期持有該鎖,那么你這個線程就一直在 while while while 地檢查是否能夠加鎖,浪費 CPU 做無用功。

適用場景:沖突不多,等待時間不長的情況下,或者少次數的嘗試自旋。

互斥鎖

操作系統負責線程調度,為了實現「鎖的狀態發生改變時再喚醒」就需要把鎖也交給操作系統管理。所以互斥器的加鎖操作通常都需要涉及到上下文切換,操作花銷也就會比自旋鎖要大。

適用場景:絕大部分情況下都可以直接使用互斥鎖。

條件鎖

它解決的問題不是「互斥」,而是「等待」。

消息隊列的消費者程序,在隊列為空的時候休息,數據不為空的時候(條件改變)啟動消費任務。條件鎖的業務針對性更強。

讀寫鎖

內部有兩個鎖,一個是讀的鎖,一個是寫的鎖。

如果只有一個讀、一個寫,那么等價于直接使用互斥鎖。

不過由于讀寫鎖需要額外記錄讀數量,花銷要大一點。

也可以認為讀寫鎖是針對某種特定情景(讀多寫少)的「優化」。

適用場景:讀多寫少,而且讀的過程時間較長,可以通過讀寫鎖,減少讀沖突時的等待。

悲觀鎖

認為每次對數據庫的操作(查詢、修改)都是不安全的,因此每次操作都會把這條數據鎖掉,直到本次操作完畢釋放該鎖。

適用場景:就是在對某個數據在處理的過程中,不允許其他人或程序或線程修改此數據,從而保證了數據修改的獨占和排他性。通常大多數的悲觀鎖都是通過數據庫的鎖機制來實現的,比如:

select * from table where id = 'xxx' for update;

缺點:悲觀鎖因為獨占和排他的特點,導致只有在事務提交以后才能被其他人(或程序或線程)修改。可想而知,如果并發量很大,將會導致應用程序在數據庫處理層面阻塞而變得十分緩慢,并發量嚴重降低。

樂觀鎖

查詢數據的時候總是認為是安全的,不會鎖數據;等到更新數據的時候會判斷這個數據是否被人修改過,如果有人修改過了則本次修改失敗。

每個人(或程序或線程)都可以去讀取并修改這個數據,但是在修改完成后,對提交才做限制,只有滿足一定條件的數據才可以被修改(提交)。樂觀鎖的實現,一般我們通過對數據庫表加一個version字段,當對某條記錄修改后,同時對version(old)+1,然后把看version(new)的值是否大于數據庫當前version(DB)的值,如果大于則提交,否則說明其他人(或程序或線程)已經修改過本條數據(version是old),只能繼續讀取數據庫最新的數據重復之前的操作。

update table set name='xxx' ,version = version(old)+1 where version = version(old) and id='xxxxxx';

比如這個sql,如果返回大于1說明數據被更新了,則說明數據從讀取出來后就沒有被其他人(或程序或線程)修改過,否則如果返回0,則說明,數據已經被修改。

缺點:當數據的修改操作發生的比較頻繁,樂觀鎖的效率就會很低,因為每次讀取后更新將基本上都不成功。

分布式鎖

為了防止分布式系統中的多個進程之間相互干擾,我們需要一種分布式協調技術來對這些進程進行調度。而這個分布式協調技術的核心就是來實現這個分布式鎖。

分布式鎖應該具備以下條件:

1、分布式系統環境下,一個方法在同一時間只能被一個機器的一個線程調用;

2、高可用的獲取鎖與釋放鎖;

3、高性能的獲取鎖與釋放鎖;

4、具備可重入特性;

5、具備鎖失效機制,防止死鎖;

6、具備非阻塞鎖特性,即沒有獲取到鎖將直接返回獲取鎖失敗。

分布式鎖的實現方法:

Memcached:利用 Memcached 的add命令。此命令是原子性操作,只有在key不存在的情況下,才能add成功,也就意味著線程得到了鎖。

Redis:和 Memcached 的方式類似,利用 Redis 的setnx命令。此命令同樣是原子性操作,只有在key不存在的情況下,才能set成功。

Zookeeper:利用 Zookeeper 的順序臨時節點,來實現分布式鎖和等待隊列。Zookeeper 設計的初衷,就是為了實現分布式鎖服務的。

Chubby:Google 公司實現的粗粒度分布式鎖服務,底層利用了 Paxos 一致性算法。

共享鎖

共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對于同一數據可以共享一把鎖,都能訪問到數據,但是只能讀不能修改。簡單的說,就是多個事務只能讀數據不能改數據。

排他鎖

排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所并存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對數據就行讀取和修改。

排他鎖指的是一個事務在一行數據加上排他鎖后,其他事務不能再在其上加其他的鎖。mysql InnoDB引擎默認的修改數據語句,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,如果加排他鎖可以使用select ...for update語句,加共享鎖可以使用select ... lock in share mode語句。所以加過排他鎖的數據行在其他事務種是不能修改數據的,也不能通過for update和lock in share mode鎖的方式查詢數據,但可以直接通過select ...from...查詢數據,因為普通查詢沒有任何鎖機制。

偏向鎖

在實際應用運行過程中發現,“鎖總是同一個線程持有,很少發生競爭”,也就是說鎖總是被第一個占用他的線程擁有,這個線程就是鎖的偏向線程。

那么只需要在鎖第一次被擁有的時候,記錄下偏向線程ID。這樣偏向線程就一直持有著鎖,直到競爭發生才釋放鎖。以后每次同步,檢查鎖的偏向線程ID與當前線程ID是否一致,如果一致直接進入同步,退出同步也,無需每次加鎖解鎖都去CAS更新對象頭,如果不一致意味著發生了競爭,鎖已經不是總是偏向于同一個線程了,這時候需要鎖膨脹為輕量級鎖,才能保證線程間公平競爭鎖。