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