解決資源共享而形成的併發==問題==算法
老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。sql
老是假設最好的狀況,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號機制和CAS算法實現。樂觀鎖適用於多讀,少寫的應用類型,這樣能夠提升吞吐量。數據庫
若是一個變量V初次讀取的時候是A值,而且在準備賦值的時候檢查到它仍然是A值,那咱們就能說明它的值沒有被其餘線程修改過了嗎?很明顯是不能的,由於在這段時間它的值可能被改成其餘值,而後又改回A,那CAS操做就會誤認爲它歷來沒有被修改過。這個問題被稱爲CAS操做的 "ABA"問題。編程
自旋CAS(也就是不成功就一直循環執行直到成功)若是長時間不成功,會給CPU帶來很是大的執行開銷session
通常是在數據表中加上一個數據版本號version字段,表示數據被修改的次數,當數據被修改時,version值會加一。當線程A要更新數據值時,在讀取數據的同時也會讀取version值,在提交更新時,若剛纔讀取到的version值爲當前數據庫中的version值相等時才更新,不然重試更新操做,直到更新成功。 提交版本必須大於記錄當前版本才能執行更新 「 的樂觀鎖策略多線程
即compare and swap(比較與交換),是一種有名的無鎖算法。無鎖編程,即不使用鎖的狀況下實現多線程之間的變量同步,也就是在沒有線程被阻塞的狀況下實現變量的同步,因此也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三個操做數併發
當且僅當 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 : 等待次數