mysql行鎖和表鎖面試 剖析MySQL InnoDB引擎的行鎖表鎖,怎樣利用鎖解決事務(wù)并發(fā)問(wèn)題?
剖析MySQL InnoDB引擎的行鎖表鎖,怎樣利用鎖解決事務(wù)并發(fā)問(wèn)題?當(dāng)多個(gè)網(wǎng)絡(luò)用戶同時(shí)讀取同一個(gè)數(shù)據(jù)庫(kù)表時(shí),不會(huì)發(fā)生沖突。只有當(dāng)一個(gè)部分讀取另一個(gè)部分或每個(gè)人都必須編寫數(shù)據(jù)庫(kù)時(shí),才會(huì)發(fā)生沖突。數(shù)據(jù)
剖析MySQL InnoDB引擎的行鎖表鎖,怎樣利用鎖解決事務(wù)并發(fā)問(wèn)題?
當(dāng)多個(gè)網(wǎng)絡(luò)用戶同時(shí)讀取同一個(gè)數(shù)據(jù)庫(kù)表時(shí),不會(huì)發(fā)生沖突。只有當(dāng)一個(gè)部分讀取另一個(gè)部分或每個(gè)人都必須編寫數(shù)據(jù)庫(kù)時(shí),才會(huì)發(fā)生沖突。數(shù)據(jù)庫(kù)執(zhí)行并發(fā)操作,即微操作為串行操作,宏操作為并行操作。MySQL是一個(gè)支持多事務(wù)處理的網(wǎng)絡(luò)數(shù)據(jù)庫(kù)。為了保證數(shù)據(jù)庫(kù)的一致性,在訪問(wèn)數(shù)據(jù)庫(kù)時(shí)必須合理使用互斥機(jī)制。
很容易理解這種機(jī)制。常用鎖包括共享鎖,即讀鎖、排他鎖,即寫鎖和更新鎖,即更新操作期間添加的鎖,也可以分類為寫鎖。如果已添加讀鎖,請(qǐng)不要添加寫鎖以防止數(shù)據(jù)不一致。如果存在寫鎖,請(qǐng)不要添加寫鎖以防止數(shù)據(jù)庫(kù)死鎖。
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對(duì)這個(gè)變量進(jìn)行寫,到底要不要加鎖?
下面簡(jiǎn)要說(shuō)明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一?lái)解釋它。看下面兩個(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問(wèn)題上來(lái),只有一個(gè)線程要寫,沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線程寫入后,其他線程無(wú)法立即看到它。這就是可見(jiàn)性問(wèn)題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
mysql怎么查看是表鎖還是行鎖?
MyISAM不支持東西,所以這些隔離級(jí)別沒(méi)有意義。然后我們來(lái)討論這些隔離級(jí)別和鎖之間的關(guān)系(例如,InnoDB支持行級(jí)鎖):首先,一件事情從begin開始,通過(guò)commit或rollback結(jié)束。因此,在考慮事物的問(wèn)題時(shí),應(yīng)該考慮事物的整個(gè)生命周期。可以多次鎖定和解鎖同一行數(shù)據(jù)傳統(tǒng)的2PL(兩相鎖定)有許多不同之處。最簡(jiǎn)單的方法是鎖緊然后均勻地松開鎖。不需要考慮釋放鎖的時(shí)間。最嚴(yán)格的是,一旦添加了所有鎖,它們只能在提交或回滾之后釋放。例如,有一行數(shù)據(jù)a,有兩件事T1和T21。Read uncommittedt1寫入A。寫入之前,會(huì)添加寫鎖,但寫入之后,會(huì)在提交之前釋放寫鎖。此時(shí),T2可以讀取A。由于T1尚未提交,因此在T2中出現(xiàn)讀取未提交的情況。21中的情況仍然是Read committed。如果T1持有a的寫鎖直到T1提交成功,那么T2不能在T1提交之前讀取a,因此可以避免讀取未提交。這是讀提交。然而,在這個(gè)隔離級(jí)別,如果T1插入一個(gè)以前不存在的新行B,那么T2可以被讀取,這將導(dǎo)致不真實(shí)的讀取。三??芍貜?fù)讀取為了避免不真實(shí)的讀取,可以添加謂詞鎖來(lái)延遲新行的添加。例如,如果T2想要讀取大于5的行,那么添加謂詞鎖,這樣就不能添加大于5的行。這個(gè)實(shí)現(xiàn)基本上實(shí)現(xiàn)了可序列化的讀取。基于鎖的東西只是一種方法,一般稱為悲觀并發(fā)控制。另外,還有:樂(lè)觀并發(fā)控制:讀寫時(shí)沒(méi)有鎖。提交時(shí),它檢測(cè)是否存在沖突。如果沒(méi)有沖突,commit成功,否則需要回滾。值得注意的是,雖然讀寫時(shí)沒(méi)有鎖,但檢測(cè)時(shí)需要鎖。否則,兩個(gè)相互沖突的東西可能會(huì)同時(shí)被成功地發(fā)現(xiàn),這在大多數(shù)材料中是沒(méi)有發(fā)現(xiàn)的。Mvcc:給每個(gè)數(shù)據(jù)一個(gè)版本號(hào)。閱讀時(shí),無(wú)需鎖定。編寫時(shí),可以選擇樂(lè)觀并發(fā)控制或悲觀并發(fā)控制。這個(gè)實(shí)現(xiàn)很容易實(shí)現(xiàn)快照隔離(它也是一個(gè)隔離級(jí)別,但沒(méi)有上面提到的那么有名)。它可以確保一切在發(fā)生之前都能看到數(shù)據(jù)庫(kù)的完整實(shí)例)。