1. 程式人生 > >Mysql-各種鎖區分與【MVCC】

Mysql-各種鎖區分與【MVCC】

mysql的鎖貌似有很多啊,查了大部分資料, 什麼表鎖,行鎖,頁鎖 共享鎖,排他鎖,意向鎖,讀鎖,寫鎖 悲觀鎖,樂觀鎖。。 我去,真想問一句,有沒有 金鎖?我還范冰冰呢。。。 哎呀怎麼感覺好亂啊。那麼把它好好整理總結下吧。 後邊還有對在innodb下的mvcc理解與舉例,在併發量的訪問下如何保持高效一致?簡單易懂了解下,聽朋友說大公司面試也愛問這個。 表/行/頁-鎖: 表級鎖(table-level locking):MyISAM和MEMORY儲存引擎 行級鎖(row-level locking) :InnoDB儲存引擎 頁面鎖(page-level-locking):BDB儲存引擎 表級鎖:開銷小,併發低
,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度也最低
行級鎖:開銷大,併發高,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。 共享/排他鎖 共享鎖又稱讀鎖,是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。 排他鎖又稱寫鎖,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。 Mysiam鎖模式 MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖。
a、對MyISAM表的讀操作(加讀鎖),不會阻塞其他程序對同一表的讀請求,但會阻塞對同一表的寫請求.只有當讀鎖釋放後才會執行其它程序的寫操作。 b、對MyISAM表的寫操作(加寫鎖),會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其它程序的讀寫操作。 innodb鎖模式 意向鎖是InnoDB自動加的,不需要使用者干預。 對於insert、update、delete,InnoDB會自動給涉及的資料加排他鎖(X);對於一般的Select語句,InnoDB不會加任何鎖,事務可以通過以下語句給顯示加共享鎖或排他鎖。 共享鎖: SELECT ... LOCK IN SHARE MODE;
排他鎖: SELECT ... FOR UPDATE; MVCC(Multiversion concurrency control) 一個很難懂得概念,查閱了很多資料與部落格,下邊做一個簡單易懂的理解。 情景模擬: 在高併發的前提下,一定要注意這個前提。 事務L1修改某表中D的key值,還未提交; 事務L2同樣也修改D的key值,提交;然後L1提交。 發生了什麼? L1從D讀取key:123對應的值100 L2從D讀取key:123對應的100 L1對值增加1,將key:123更新為100 + 1 L2對值增加2,將key:123更新為100 + 2 如果L1和L2序列執行,key:123對應的值將為103,但上面併發執行中L1的執行效果完全被L2所覆蓋,實際key:123所對應的值變成了102。就因為L1事務沒提交呢,L2又來了。 那如何處理呢? 方法一: 加鎖唄。前邊不都是在說這個鎖的問題呢,把他加寫鎖,等L1執行完再執行L2。可以是可以,但是發生了排隊,併發下降了。這是一種悲觀一般把基於鎖的併發控制機稱成為悲觀機制。 方法二: 為了實現可序列化,同時避免鎖機制存在的各種問題,我們可以採用基於多版本併發控制(Multiversion concurrency control,MVCC)思想的無鎖併發機制,終於把要說的引出來了!人們一般把基於鎖的併發控制機稱成為悲觀機制(悲觀鎖),而把MVCC等機制稱為樂觀機制(樂觀鎖)。加入版本號的一個機制,由D維護該版本號,每次資料有更新就增加版本號,通過版本號來更加高效的管理事務一致性與高併發的問題。 因為鎖機制是一種預防性的,讀會阻塞寫,寫也會阻塞讀,當鎖定粒度較大,時間較長是併發效能就不會太好;而MVCC是一種後驗性的,讀不阻塞寫,寫也不阻塞讀,等到提交的時候才檢驗是否有衝突,由於沒有鎖,所以讀寫不會相互阻塞,從而大大提升了併發效能。 相關文文章

相關推薦

Mysql-各種區分MVCC

mysql的鎖貌似有很多啊,查了大部分資料, 什麼表鎖,行鎖,頁鎖 共享鎖,排他鎖,意向鎖,讀鎖,寫鎖 悲觀鎖,樂觀鎖。。 我去,真想問一句,有沒有 金鎖?我還范冰冰呢。。。 哎呀怎麼感覺好亂啊。那

MySQL資料庫的詳解

當然在我們的資料庫中也有鎖用來控制資源的併發訪問,這也是資料庫和檔案系統的區別之一。 為什麼要懂資料庫鎖? 通常來說對於一般的開發人員,在使用資料庫的時候一般懂點 DQL(select),DML(insert,update,delete)就夠了。 小明是一個剛剛畢業在網際網路公司工作的 Java 開發工

Mysql order by 不唯一欄位limit混用的坑

背景: 分頁查詢排序後的資料,是一個非常常見的業務場景;但當使用不唯一的欄位排序時,分兩頁查詢的資料可能出現同一條資料,並丟失資料! 示例: 同樣的查詢條件,offset不同,竟然取到了同一條

java軟件設計模式——單例設計模式中的餓漢式 懶漢式示例

nal pre turn new對象 構造方法 sta 餓漢式 () urn 以下為單例設計模式中的兩種經典模式的代碼示意: 1 單例設計模式(spring框架IOC,默認創建的對象都是單例的): 2 餓漢式: 3 public class Sing

各種 Java Thread State轉載

tin run 監視器 .com str ack tran queue 我們 1,線程狀態為“waiting for monitor entry”: 意味著它 在等待進入一個臨界區 ,所以它在”Entry Set“隊列中等待。 此時線程狀態一般都是 Blocked: j

Mysql機制PHP文件處理高並發簡單思路

三種 default [0 pda utf8 pen sql incr update 以購買商品舉例: ① 從數據庫獲取庫存的數量。 ② 檢查一下庫存的數量是否充足。 ③ 庫存的數量減去買家購買的數量(以每個用戶購買一個為例)。 ④ 最後完成購買。 僅僅這幾行邏輯代碼在並發

使用 Xtrabackup 在線對MySQL做主從復制

blog screen art http 地址 備份恢復 日誌記錄 其中 sea 1. 說明 1.1 xtrabackup mysqldump對於導出10G以下的數據庫或幾個表,還是適用的,而且更快捷。一旦數據量達到100-500G,無論是對原庫的壓力還是導出的性能,m

MySQL增刪改查之

rst 有用 trunc bsp 備份 王寶強 增刪改 fault lock 使用 delete 刪除記錄 類別詳細解示 基本語法 DELETE FROM 表 [where 條件]; 示例 DELETE FROM user where id > 10;

MySQL增刪改查之

說明 war use 用戶表 head 增刪 結構 fec 更新數據 更新數據我們已經說過。需要修改內容,修改銀行卡余額,修改裝備信息的時候都需要使用到update,修改語句。 修改(也叫更新)語句的基本語語法如下: 類別詳細解示 基本語法 update 表名 s

MySQL 5.6 GTID Replication

cut show ret bind syntax isa binlog格式 1-1 close 一. MySQL 5.6引入了GTID的概念,那麽GTID是何方神聖?其實也不復雜,就是一個全局事務標示符。使用GTID時,每次事務提交都會在binlog裏生成1個唯一的標示符,

MySQL數據庫學習補充mysql老是停止運行該怎麽解決

mys 補充 分享 mysq http mysql數據庫 解決 img post 解決方法如下: MySQL數據庫學習【補充】mysql老是停止運行該怎麽解決

MySQL數據庫學習補充MySQL 5.7.9版本sql_mode=only_full_group_by問題

bsp lock sql alt glob 當前 log cti src 用到GROUP BY 語句查詢時com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT

MySql悲觀總結實踐

數據表 date操作 設置 下單 開始 說明 AR 根據 業務 mysql(for update)悲觀鎖總結與實踐 https://blog.csdn.net/zmx729618/article/details/52701972 悲觀鎖,正如其名,它指的是對數據被外界(包括

mysql分析實踐

一序      本文分為兩個部分,第一部分主要基於何登成大神的文章。何博士作為阿里資料庫核心團隊大神。文章更是深入淺出。膜拜一下:原文地址如下  http://hedengcheng.com/?p=771    第二部分介紹常見的實踐注意事項。 二 背景   MVCC

Hyper-VVirtualBoxVMware衝突的解決方法

VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot

service mysql start 報錯總結

在linux上安裝mysql後 啟動mysql,或者在使用mysql過程中啟動mysql 可能出現以下錯: 常見錯誤以下三種,可迴圈解決!  讓報錯無所遁形!!! 報錯一: ERROR! MySQL is running but PID file coul

XMLHTML

前言    剛接觸XML不知道它是幹嘛的。通過視訊和網上查閱資料發現都是和HTML在對比學習,大家都對HTML比較熟悉。下面我總結一下它們兩者的區別 What

Hyper-VVirtualBoxVMware沖突的解決方法

列表 not 模擬 .html off 解決方法 have detect 命令 安裝Visual Studio以後可能會導致與VirtualBox、VMware產生沖突,這是因為安裝了Windows Phone SDK,沖突表現為: 打開VirtualBox、VMware

Mysql的幾種搜尋引擎轉載

MySQL資料庫引擎取決於MySQL在安裝的時候是如何被編譯的。要新增一個新的引擎,就必須重新編譯MYSQL。在預設情況下,MYSQL支援三個引擎:ISAM、MYISAM和HEAP。另外兩種型別INNODB和BERKLEY(BDB),也常常可以使用。如果技術高超,還可以使用M

Mysql心路歷程:Mysql各種機制(入門篇)

這一篇文章是本人資料庫的第二篇,也是對資料庫學習的階段性總結。對於資料庫鎖的瞭解,是區分程式設計師,尤其是Java程式設計師,中