一、如果同一條記錄同時(shí)多個(gè)進(jìn)程可能對(duì)不同的字段進(jìn)行修改,怎么保證列鎖
沒(méi)聽(tīng)說(shuō)有列鎖的機(jī)制,主流的方式就是行鎖。
我覺(jué)得你這種需求可以歸到“熱點(diǎn)行”優(yōu)化上來(lái),秒殺場(chǎng)景下的庫(kù)存扣減就是最典型的“熱點(diǎn)行”事務(wù),有兩個(gè)優(yōu)化方法:名列前茅數(shù)據(jù)庫(kù)可以將可能沖突的plan放在同一個(gè)線程排隊(duì),減少鎖沖突引起的喚醒和忙等代價(jià);另外就是可以使用“early lock release”的方式,在事務(wù)確定可以提交的情況下,不等待刷redolog而提前釋放行鎖,使得修改同一行的多個(gè)事務(wù),有可能在一次group commit內(nèi)提交,當(dāng)然前提是這是一條auto commit的事務(wù),而非交互型事務(wù)。當(dāng)時(shí)做Oceanbase0.4版本時(shí)已經(jīng)實(shí)現(xiàn)了這兩個(gè)優(yōu)化。
當(dāng)我們嘗試加細(xì)鎖的粒度時(shí),一定是當(dāng)前的粒度無(wú)法充分應(yīng)對(duì)競(jìng)態(tài)的頻繁發(fā)生。字段鎖可以緩解的是”多個(gè)事務(wù)修改某一記錄的不同字段引起的阻塞”,而不是相同字段上的阻塞。這個(gè)時(shí)候建議題主反過(guò)來(lái)想一想,解決這個(gè)問(wèn)題,一定要用字段鎖嗎?分表就可以了。每一次加細(xì)鎖的粒度都是對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)引擎設(shè)計(jì)的挑戰(zhàn)。一方面它極大提高了系統(tǒng)的復(fù)雜度,另一方面,維護(hù)細(xì)粒度鎖產(chǎn)生的內(nèi)存對(duì)象也極大地增加了系統(tǒng)的overhead。從表鎖,頁(yè)鎖向行鎖跨越的歷史可以明確地證實(shí)這一點(diǎn)。
延伸閱讀:
二、數(shù)據(jù)庫(kù)和 SQL 概念
數(shù)據(jù)庫(kù)(Database)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù),它的產(chǎn)生距今已有六十多年。隨著信息技術(shù)和市場(chǎng)的發(fā)展,數(shù)據(jù)庫(kù)變得無(wú)處不在:它在電子商務(wù)、銀行系統(tǒng)等眾多領(lǐng)域都被廣泛使用,且成為其系統(tǒng)的重要組成部分。
數(shù)據(jù)庫(kù)用于記錄數(shù)據(jù),使用數(shù)據(jù)庫(kù)記錄數(shù)據(jù)可以表現(xiàn)出各種數(shù)據(jù)間的聯(lián)系,也可以很方便地對(duì)所記錄的數(shù)據(jù)進(jìn)行增、刪、改、查等操作。
結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)簡(jiǎn)稱 SQL,是上世紀(jì) 70 年代由 IBM 公司開(kāi)發(fā),用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的語(yǔ)言。更詳細(xì)地說(shuō),SQL 是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),同時(shí)也是數(shù)據(jù)庫(kù)腳本文件的擴(kuò)展名。