在一個update和insert操作頻繁的表中 少量數(shù)據(jù)測試的時候運行良好 在實際運營中 因數(shù)據(jù)量比較大( 萬條記錄) 會出現(xiàn)死鎖現(xiàn)象 用show processlist查看 可以看到一個update語句狀態(tài)是Locked 一個delete語句狀態(tài)是Sending data 查看了一下參考手冊 把鎖定相關(guān)的資料整理下來 以便自己記錄和追蹤該問題的解決情況
為東安等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及東安網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、東安網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
MySQL 支持對MyISAM和MEMORY表進行表級鎖定 對BDB表進行頁級鎖定 對InnoDB 表進行行級鎖定 在許多情況下 可以根據(jù)培訓(xùn)猜測應(yīng)用程序使用哪類鎖定類型最好 但一般很難說出某個給出的鎖類型就比另一個好 一切取決于應(yīng)用程序 應(yīng)用程序的不同部分可能需要不同的鎖類型 為了確定是否想要使用行級鎖定的存儲引擎 應(yīng)看看應(yīng)用程序做什么并且混合使用什么樣的選擇和更新語句 例如 大多數(shù)Web應(yīng)用程序執(zhí)行許多選擇 而很少進行刪除 只對關(guān)鍵字的值進行更新 并且只插入少量具體的表 基本MySQL MyISAM設(shè)置已經(jīng)調(diào)節(jié)得很好
在MySQL中對于使用表級鎖定的存儲引擎 表鎖定時不會死鎖的 這通過總是在一個查詢開始時立即請求所有必要的鎖定并且總是以同樣的順序鎖定表來管理
對WRITE MySQL使用的表鎖定方法原理如下
◆ 如果在表上沒有鎖 在它上面放一個寫鎖
◆否則 把鎖定請求放在寫鎖定隊列中
對READ MySQL使用的鎖定方法原理如下
◆如果在表上沒有寫鎖定 把一個讀鎖定放在它上面
◆否則 把鎖請求放在讀鎖定隊列中
當一個鎖定被釋放時 鎖定可被寫鎖定隊列中的線程得到 然后是讀鎖定隊列中的線程
這意味著 如果你在一個表上有許多更新 SELECT語句將等待直到?jīng)]有更多的更新
如果INSERT 語句不沖突 可以自由為MyISAM 表混合并行的INSERT 和SELECT 語句而不需要鎖定
InnoDB 使用行鎖定 BDB 使用頁鎖定 對于這兩種存儲引擎 都可能存在死鎖 這是因為 在SQL語句處理期間 InnoDB 自動獲得行鎖定 BDB 獲得頁鎖定 而不是在事務(wù)啟動時獲得
行級鎖定的優(yōu)點
· 當在許多線程中訪問不同的行時只存在少量鎖定沖突
· 回滾時只有少量的更改
· 可以長時間鎖定單一的行
行級鎖定的缺點
· 比頁級或表級鎖定占用更多的內(nèi)存
· 當在表的大部分中使用時 比頁級或表級鎖定速度慢 因為你必須獲取更多的鎖
· 如果你在大部分數(shù)據(jù)上經(jīng)常進行 GROUP BY 操作或者必須經(jīng)常掃描整個表 比其它鎖定明顯慢很多
· 用高級別鎖定 通過支持不同的類型鎖定 你也可以很容易地調(diào)節(jié)應(yīng)用程序 因為其鎖成本小于行級鎖定
在以下情況下 表鎖定優(yōu)先于頁級或行級鎖定
· 表的大部分語句用于讀取
· 對嚴格的關(guān)鍵字進行讀取和更新 你可以更新或刪除可以用單一的讀取的關(guān)鍵字來提取的一行
# ; UPDATE tbl_name SET column = value WHERE unique_key_col = key_value ;
# ; DELETE FROM tbl_name WHERE unique_key_col = key_value ;
· SELECT 結(jié)合并行的INSERT 語句 并且只有很少的UPDATE或 DELETE 語句
· 在整個表上有許多掃描或 GROUP BY 操作 沒有任何寫操作
lishixinzhi/Article/program/MySQL/201311/29594
方法如下:
1、首先打開Mysql命令行編輯器,連接Mysql數(shù)據(jù)庫;
2、使用所要操作的數(shù)據(jù)庫,先顯示一下數(shù)據(jù)庫中的表;
3、顯示一下表結(jié)構(gòu),了解一下表中的列;
4、向表插入數(shù)據(jù),insert into 表名 (列名) values (值);
5、查詢表可以看到所插入的數(shù)據(jù),select * from 表名;
6、可以再插入一個數(shù)據(jù),顯示一下。
擴展資料:
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于?Oracle?旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的?RDBMS?(Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件。
MySQL是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
由于其社區(qū)版的性能卓越,搭配?PHP?和?Apache?可組成良好的開發(fā)環(huán)境。
與其他的大型數(shù)據(jù)庫,例如?Oracle、DB2、SQL Server等相比,MySQL自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業(yè)來說,MySQL提供的功能已經(jīng)綽綽有余,而且由于 MySQL是開放源碼軟件,因此可以大大降低總體擁有成本。
Linux作為操作系統(tǒng),Apache?或Nginx作為?Web?服務(wù)器,MySQL 作為數(shù)據(jù)庫,PHP/Perl/Python作為服務(wù)器端腳本解釋器。由于這四個軟件都是免費或開放源碼軟件(FLOSS),因此使用這種方式不用花一分錢(除開人工成本)就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng),被業(yè)界稱為“LAMP“或“LNMP”組合。
MyISAMMySQL 5.0 之前的默認數(shù)據(jù)庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務(wù)
InnoDB事務(wù)型數(shù)據(jù)庫的首選引擎,支持ACID事務(wù),支持行級鎖定, MySQL 5.5 起成為默認數(shù)據(jù)庫引擎
BDB源 自 Berkeley DB,事務(wù)型數(shù)據(jù)庫的另一種選擇,支持Commit 和Rollback 等其他事務(wù)特性
Memory所有數(shù)據(jù)置于內(nèi)存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數(shù)據(jù)量成正比的內(nèi)存空間。并且其內(nèi)容會在 MySQL 重新啟動時丟失
Merge將一定數(shù)量的 MyISAM 表聯(lián)合而成一個整體,在超大規(guī)模數(shù)據(jù)存儲時很有用
Archive非常適合存儲大量的獨立的,作為歷史記錄的數(shù)據(jù)。因為它們不經(jīng)常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差
Federated將不同的 MySQL 服務(wù)器聯(lián)合起來,邏輯上組成一個完整的數(shù)據(jù)庫。非常適合分布式應(yīng)用
Cluster/NDB高冗余的存儲引擎,用多臺數(shù)據(jù)機器聯(lián)合提供服務(wù)以提高整體性能和安全性。適合數(shù)據(jù)量大,安全和性能要求高的應(yīng)用
CSV: 邏輯上由逗號分割數(shù)據(jù)的存儲引擎。它會在數(shù)據(jù)庫子目錄里為每個數(shù)據(jù)表創(chuàng)建一個 .csv 文件。這是一種普通文本文件,每個數(shù)據(jù)行占用一個文本行。CSV 存儲引擎不支持索引。
BlackHole:黑洞引擎,寫入的任何數(shù)據(jù)都會消失,一般用于記錄 binlog 做復(fù)制的中繼
EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作為 MySQL?源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發(fā)者。EXAMPLE 存儲引擎不支持編索引。
另外,MySQL 的存儲引擎接口定義良好。有興趣的開發(fā)者可以通過閱讀文檔編寫自己的存儲引擎。
參考資料來源:百度百科:mySQL
鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制,在數(shù)據(jù)庫中,除傳統(tǒng)的計算資源(CPU、RAM、I/O)爭用外,數(shù)據(jù)也是一種供許多用戶共享的資源,如何保證數(shù)據(jù)并發(fā)訪問的一致性,有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素,從這個角度來說,鎖對數(shù)據(jù)庫而言是尤其重要,也更加復(fù)雜。MySQL中的鎖,按照鎖的粒度分為:1、全局鎖,就鎖定數(shù)據(jù)庫中的所有表。2、表級鎖,每次操作鎖住整張表。3、行級鎖,每次操作鎖住對應(yīng)的行數(shù)據(jù)。
全局鎖就是對整個數(shù)據(jù)庫實例加鎖,加鎖后整個實例就處于只讀狀態(tài),后續(xù)的DML的寫語句,DDL語句,已經(jīng)更新操作的事務(wù)提交語句都將阻塞。其典型的使用場景就是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數(shù)據(jù)的完整性。但是對數(shù)據(jù)庫加全局鎖是有弊端的,如在主庫上備份,那么在備份期間都不能執(zhí)行更新,業(yè)務(wù)會受影響,第二如果是在從庫上備份,那么在備份期間從庫不能執(zhí)行主庫同步過來的二進制日志,會導(dǎo)致主從延遲。
解決辦法是在innodb引擎中,備份時加上--single-transaction參數(shù)來完成不加鎖的一致性數(shù)據(jù)備份。
添加全局鎖: flush tables with read lock; 解鎖 unlock tables。
表級鎖,每次操作會鎖住整張表.鎖定粒度大,發(fā)送鎖沖突的概率最高,并發(fā)讀最低,應(yīng)用在myisam、innodb、BOB等存儲引擎中。表級鎖分為: 表鎖、元數(shù)據(jù)鎖(meta data lock, MDL)和意向鎖。
表鎖又分為: 表共享讀鎖 read lock、表獨占寫鎖write lock
語法: 1、加鎖 lock tables 表名 ... read/write
2、釋放鎖 unlock tables 或者關(guān)閉客戶端連接
注意: 讀鎖不會阻塞其它客戶端的讀,但是會阻塞其它客戶端的寫,寫鎖既會阻塞其它客戶端的讀,又會阻塞其它客戶端的寫。大家可以拿一張表來測試看看。
元數(shù)據(jù)鎖,在加鎖過程中是系統(tǒng)自動控制的,無需顯示使用,在訪問一張表的時候會自動加上,MDL鎖主要作用是維護表元數(shù)據(jù)的數(shù)據(jù)一致性,在表上有活動事務(wù)的時候,不可以對元數(shù)據(jù)進行寫入操作。為了避免DML和DDL沖突,保證讀寫的正確性。
在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結(jié)構(gòu)進行變更操作時,加MDL寫鎖(排他).
查看元數(shù)據(jù)鎖:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema_metadata_locks;
意向鎖,為了避免DML在執(zhí)行時,加的行鎖與表鎖的沖突,在innodb中引入了意向鎖,使得表鎖不用檢查每行數(shù)據(jù)是否加鎖,使用意向鎖來減少表鎖的檢查。意向鎖分為,意向共享鎖is由語句select ... lock in share mode添加。意向排他鎖ix,由insert,update,delete,select。。。for update 添加。
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock;
行級鎖,每次操作鎖住對應(yīng)的行數(shù)據(jù),鎖定粒度最小,發(fā)生鎖沖突的概率最高,并發(fā)讀最高,應(yīng)用在innodb存儲引擎中。
innodb的數(shù)據(jù)是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現(xiàn)的,而不是對記錄加的鎖,對于行級鎖,主要分為以下三類:
1、行鎖或者叫record lock記錄鎖,鎖定單個行記錄的鎖,防止其他事物對次行進行update和delete操作,在RC,RR隔離級別下都支持。
2、間隙鎖Gap lock,鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事物在這個間隙進行insert操作,產(chǎn)生幻讀,在RR隔離級別下都支持。
3、臨鍵鎖Next-key-lock,行鎖和間隙鎖組合,同時鎖住數(shù)據(jù),并鎖住數(shù)據(jù)前面的間隙Gap,在RR隔離級別下支持。
innodb實現(xiàn)了以下兩種類型的行鎖
1、共享鎖 S: 允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。
2、排他鎖 X: 允許獲取排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)獲得相同數(shù)據(jù)集的共享鎖和排他鎖。
insert 語句 排他鎖 自動添加的
update語句 排他鎖 自動添加
delete 語句 排他鎖 自動添加
select 正常查詢語句 不加鎖 。。。
select 。。。lock in share mode 共享鎖 需要手動在select 之后加lock in share mode
select 。。。for update 排他鎖 需要手動在select之后添加for update
默認情況下,innodb在repeatable read事務(wù)隔離級別運行,innodb使用next-key鎖進行搜索和索引掃描,以防止幻讀。
間隙鎖唯一目的是防止其它事務(wù)插入間隙,間隙鎖可以共存,一個事務(wù)采用的間隙鎖不會阻止另一個事務(wù)在同一間隙上采用的間隙鎖。
用以下sql語句就可以實現(xiàn)行鎖定,前提是innodb模式:
SELECT ... FOR UPDATE
或者
SELECT ... LOCK IN SHARE MODE
當前題目:mysql怎么鎖行數(shù)據(jù)庫 mysql表鎖行鎖
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article0/doppgoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、自適應(yīng)網(wǎng)站、網(wǎng)站制作、網(wǎng)站設(shè)計、動態(tài)網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)