MySQL8.x 中新增了一個(gè)輕量級(jí)的備份鎖,它允許在 online 備份的時(shí)候進(jìn)行 DML 操作,同時(shí)可防止快照不一致。這個(gè)鎖禁止的操作很少,它禁止的操作包括:
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)赫山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
文件的創(chuàng)建、刪除、改名
賬戶的管理
REPAIR TABLE
TRUNCATE TABLE
OPTIMIZE TABLE
備份鎖由?lock instance for backup?和?unlock instance?語法組成。使用這些語句需要 BACKUP_ADMIN 權(quán)限。
加鎖情況與死鎖原因分析
為方便大家復(fù)現(xiàn),完整表結(jié)構(gòu)和數(shù)據(jù)如下:
CREATE TABLE `t3` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
UNIQUE KEY `c2` (`c2`)
) ENGINE=InnoDB
insert into t3 values(1,1),(15,15),(20,20);
在 session1 執(zhí)行 commit 的瞬間,我們會(huì)看到 session2、session3 的其中一個(gè)報(bào)死鎖。這個(gè)死鎖是這樣產(chǎn)生的:
1.?session1 執(zhí)行 delete ?會(huì)在唯一索引 c2 的 c2 = 15 這一記錄上加 X lock(也就是在MySQL 內(nèi)部觀測(cè)到的:X Lock but not gap);
2.?session2 和 session3 在執(zhí)行 insert 的時(shí)候,由于唯一約束檢測(cè)發(fā)生唯一沖突,會(huì)加 S Next-Key Lock,即對(duì) (1,15] 這個(gè)區(qū)間加鎖包括間隙,并且被 seesion1 的 X Lock 阻塞,進(jìn)入等待;
3.?session1 在執(zhí)行 commit 后,會(huì)釋放 X Lock,session2 和 session3 都獲得 S Next-Key Lock;
4.?session2 和 session3 繼續(xù)執(zhí)行插入操作,這個(gè)時(shí)候 INSERT INTENTION LOCK(插入意向鎖)出現(xiàn)了,并且由于插入意向鎖會(huì)被 gap 鎖阻塞,所以 session2 和 session3 互相等待,造成死鎖。
死鎖日志如下:
請(qǐng)點(diǎn)擊輸入圖片描述
INSERT INTENTION LOCK
在之前的死鎖分析第四點(diǎn),如果不分析插入意向鎖,也是會(huì)造成死鎖的,因?yàn)椴迦胱罱K還是要對(duì)記錄加 X Lock 的,session2 和 session3 還是會(huì)互相阻塞互相等待。
但是插入意向鎖是客觀存在的,我們可以在官方手冊(cè)中查到,不可忽略:
Prior to inserting the row, a type of gap lock called an insert intention gap lock is set. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.
插入意向鎖其實(shí)是一種特殊的 gap lock,但是它不會(huì)阻塞其他鎖。假設(shè)存在值為 4 和 7 的索引記錄,嘗試插入值 5 和 6 的兩個(gè)事務(wù)在獲取插入行上的排它鎖之前使用插入意向鎖鎖定間隙,即在(4,7)上加 gap lock,但是這兩個(gè)事務(wù)不會(huì)互相沖突等待。
當(dāng)插入一條記錄時(shí),會(huì)去檢查當(dāng)前插入位置的下一條記錄上是否存在鎖對(duì)象,如果下一條記錄上存在鎖對(duì)象,就需要判斷該鎖對(duì)象是否鎖住了 gap。如果 gap 被鎖住了,則插入意向鎖與之沖突,進(jìn)入等待狀態(tài)(插入意向鎖之間并不互斥)??偨Y(jié)一下這把鎖的屬性:
1. 它不會(huì)阻塞其他任何鎖;
2. 它本身僅會(huì)被 gap lock 阻塞。
在學(xué)習(xí) MySQL 過程中,一般只有在它被阻塞的時(shí)候才能觀察到,所以這也是它常常被忽略的原因吧...
GAP LOCK
在此例中,另外一個(gè)重要的點(diǎn)就是 gap lock,通常情況下我們說到 gap lock 都只會(huì)聯(lián)想到 REPEATABLE-READ 隔離級(jí)別利用其解決幻讀。但實(shí)際上在 READ-COMMITTED 隔離級(jí)別,也會(huì)存在 gap lock ,只發(fā)生在:唯一約束檢查到有唯一沖突的時(shí)候,會(huì)加 S Next-key Lock,即對(duì)記錄以及與和上一條記錄之間的間隙加共享鎖。
通過下面這個(gè)例子就能驗(yàn)證:
請(qǐng)點(diǎn)擊輸入圖片描述
這里 session1 插入數(shù)據(jù)遇到唯一沖突,雖然報(bào)錯(cuò),但是對(duì) (15,20] 加的 S Next-Key Lock 并不會(huì)馬上釋放,所以 session2 被阻塞。另外一種情況就是本文開始的例子,當(dāng) session2 插入遇到唯一沖突但是因?yàn)楸?X Lock 阻塞,并不會(huì)立刻報(bào)錯(cuò) “Duplicate key”,但是依然要等待獲取 S Next-Key Lock 。
有個(gè)困惑很久的疑問:出現(xiàn)唯一沖突需要加 S Next-Key Lock 是事實(shí),但是加鎖的意義是什么?還是說是通過 S Next-Key Lock 來實(shí)現(xiàn)的唯一約束檢查,但是這樣意味著在插入沒有遇到唯一沖突的時(shí)候,這個(gè)鎖會(huì)立刻釋放,這不符合二階段鎖原則。這點(diǎn)希望能與大家一起討論得到好的解釋。
如果是在 REPEATABLE-READ,除以上所說的唯一約束沖突外,gap lock 的存在是這樣的:
普通索引(非唯一索引)的S/X Lock,都帶 gap 屬性,會(huì)鎖住記錄以及前1條記錄到后1條記錄的左閉右開區(qū)間,比如有[4,6,8]記錄,delete 6,則會(huì)鎖住[4,8)整個(gè)區(qū)間。
對(duì)于 gap lock,相信 DBA 們的心情是一樣一樣的,所以我的建議是:
1. 在絕大部分的業(yè)務(wù)場(chǎng)景下,都可以把 MySQL 的隔離界別設(shè)置為 READ-COMMITTED;
2. 在業(yè)務(wù)方便控制字段值唯一的情況下,盡量減少表中唯一索引的數(shù)量。
鎖沖突矩陣
前面我們說的 GAP LOCK 其實(shí)是鎖的屬性,另外我們知道 InnoDB 常規(guī)鎖模式有:S 和 X,即共享鎖和排他鎖。鎖模式和鎖屬性是可以隨意組合的,組合之后的沖突矩陣如下,這對(duì)我們分析死鎖很有幫助:
請(qǐng)點(diǎn)擊輸入圖片描述
這個(gè)是屬于系統(tǒng)遺留問題,也就是一種系統(tǒng)的保護(hù)機(jī)制。就是為了避免出現(xiàn)這種在線修改系統(tǒng)的操作。
增加字段屬于系統(tǒng)的修改操作。盡量不要在線操作,因?yàn)榭赡艹霈F(xiàn)。未知的漏洞。一定要。離線。修改完畢,然后經(jīng)過測(cè)試后。認(rèn)為已經(jīng)沒有問題了。在。次日的凌晨發(fā)一個(gè)通知。停機(jī)維護(hù)。這樣才能保證系統(tǒng)的正常運(yùn)轉(zhuǎn)。
如果在前期設(shè)置系統(tǒng)的時(shí)候就預(yù)留了。熱升級(jí)的空間。這樣才能達(dá)到在線操作的目的,而且系統(tǒng)的金融群總是一部分先升級(jí)。
很多情況下,你需要使用系統(tǒng)里邊的工具集。在線修改表格。原理其實(shí)非常的簡(jiǎn)單,新建的和原表的表格結(jié)構(gòu)。要一模一樣。對(duì)這個(gè)表格進(jìn)行修改,然后把結(jié)構(gòu)變更的日期。插入進(jìn)去。而且還建議您盡量在業(yè)務(wù)的低縫隙進(jìn)行修改。避免發(fā)生不可控的未知狀況。
使用說明:
1、如果是用 MySQL + Apache,使用的又是 FreeBSD 網(wǎng)絡(luò)操作系統(tǒng)的話,安裝時(shí)候你應(yīng)按注意到FreeBSD的版本問題,在FreeBSD 的 3.0 以下版本來說,MySQL Source 內(nèi)含的 MIT-pthread 運(yùn)行是正常的,但在這版本以上,你必須使用 native threads。
2、如果在 COMPILE 過程中出了問題,請(qǐng)先檢查你的 gcc版本是否在 2.81 版本以上,gmake 版本是否在3.75以上。
3、如果不是版本的問題,那可能是你的內(nèi)存不足,請(qǐng)使用configure--with-low-memory 來加入。
4、如果要重新做你的configure,那么你可以鍵入rm config.cache和make clean來清除記錄。
5、把 MySQL 安裝在 /usr/local 目錄下,這是缺省值,您也可以按照你的需要設(shè)定你所安裝的目錄。
文章標(biāo)題:mysql怎么加字段鎖表 mysql怎么編寫加鎖的sql語句
文章起源:http://www.sd-ha.com/article32/docjppc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、云服務(wù)器、服務(wù)器托管、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)