鎖機制

1三、鎖機制

解決資源共享而形成的併發==問題==算法

13.一、悲觀鎖

老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。sql

13.二、樂觀鎖

老是假設最好的狀況,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號機制和CAS算法實現。樂觀鎖適用於多讀,少寫的應用類型,這樣能夠提升吞吐量數據庫

13.2.一、樂觀鎖的缺點

ABA 問題

若是一個變量V初次讀取的時候是A值,而且在準備賦值的時候檢查到它仍然是A值,那咱們就能說明它的值沒有被其餘線程修改過了嗎?很明顯是不能的,由於在這段時間它的值可能被改成其餘值,而後又改回A,那CAS操做就會誤認爲它歷來沒有被修改過。這個問題被稱爲CAS操做的 "ABA"問題。編程

自旋CAS(也就是不成功就一直循環執行直到成功)若是長時間不成功,會給CPU帶來很是大的執行開銷session

13.2.二、樂觀鎖的實現

版本號機制

通常是在數據表中加上一個數據版本號version字段,表示數據被修改的次數,當數據被修改時,version值會加一。當線程A要更新數據值時,在讀取數據的同時也會讀取version值,在提交更新時,若剛纔讀取到的version值爲當前數據庫中的version值相等時才更新,不然重試更新操做,直到更新成功。 提交版本必須大於記錄當前版本才能執行更新 「 的樂觀鎖策略多線程

CAS算法

compare and swap(比較與交換),是一種有名的無鎖算法。無鎖編程,即不使用鎖的狀況下實現多線程之間的變量同步,也就是在沒有線程被阻塞的狀況下實現變量的同步,因此也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三個操做數併發

  • 須要讀寫的內存值 V
  • 進行比較的值 A
  • 擬寫入的新值 B

當且僅當 V 的值等於 A時,CAS經過原子方式用新值B來更新V的值,不然不會執行任何操做(比較和替換是一個原子操做)。通常狀況下是一個自旋操做,即不斷的重試工具

CAS 只對單個共享變量有效,當操做涉及跨多個共享變量時 CAS 無效命令行

鎖的分類

操做類型:線程

  • 讀鎖(共享鎖): 對同一個數據,多個讀操做能夠同時進行,可是不能夠進行寫操做
  • 寫鎖(互斥鎖): 若是當前寫操做沒有完畢,那麼沒法進行其餘的操做(讀操做、寫操做)

操做範圍:

  • 表鎖:一次性對一張表總體加鎖 例如MyISAM ,

    • 優勢:開銷小加鎖快
    • 缺點:鎖的範圍大,容易發生衝突。
  • 行鎖:一次性對一行數據加鎖
  • 頁鎖

鎖操做

--加鎖
lock table  mytable read/write; 

--查看加鎖的表
show open tables;

--會話:session: 每個訪問數據的dos命令行、數據庫客戶端工具


----------【加讀鎖】
--會話0
--對A表加了【讀鎖】,那麼會話0能夠對A表進行讀,可是不能夠寫
--會話0不能夠對其餘表進行        讀和寫

--其餘會話
---能夠對A表進行讀操做,
---寫操做會等待A表的讀鎖釋放




----------【加寫鎖】

--會話0給表A加寫鎖,那麼會話0能夠對A表進行【任何操做】,可是【不能】對其餘表操做

--其餘會話:
 ---能夠對會話0加鎖的表進行增刪改查,可是要等會話0釋放鎖
查看那些表加了鎖: show open tables ;1表明加了鎖

分析表鎖定的嚴重程度: hosw status like ' table%' ;

​ table_locks_immediate:可能獲取到的鎖數

​ Table_locks_waited:表示要等待的鎖數

表鎖經過unlock tables 進行解鎖

行鎖經過事務進行解鎖,commit rollback

行鎖的注意狀況

--若是沒有【索引】,行鎖會轉換爲【表鎖】

索引類發生了 類型轉換,那麼索引失效。所以鎖已經轉換,那麼會執行失敗

行鎖分析

show status like '%innodb_row_lock%';

----Innodb_row_lock_current_waits :當前正在等待的鎖的數量
| Innodb_row_lock_time : 等待總時長。從系統啓動到如今一共等待的時間
| Innodb_row_lock_time_avg :平均等待的市場。從系統啓動到如今的平均等待時間
| Innodb_row_lock_time_max 最大等待時間。從系統啓動到如今最大一次等待時間

| Innodb_row_lock_waits : 等待次數

相關文章
相關標籤/搜索