一、兩個(gè)人同時(shí)操縱數(shù)據(jù)庫(kù),怎么處理并發(fā)問(wèn)題
從數(shù)據(jù)庫(kù)層面上,有三種解決方式:
1.悲觀鎖
select XXX from 商品庫(kù)存表 for update 。
用戶A 和B 同時(shí)操作一個(gè)商品的庫(kù)存,數(shù)據(jù)庫(kù)層面上,必有一個(gè)先后順序。
先執(zhí)行select XXX for update 的,會(huì)得到數(shù)據(jù)庫(kù)層面上的鎖。 后到的,程序會(huì)阻塞在這一句,直到前一個(gè)釋放鎖。
壞處是 系統(tǒng)并發(fā)數(shù)到此處會(huì)急劇減小。畢竟 只能有一個(gè)用戶操作,其他人都要等著。
2.樂(lè)觀鎖
名列前茅步: 代碼中查詢商品庫(kù)存信息,并校驗(yàn)數(shù)量是否大于1
Product p = getFromDB(productId);
Date lastUpdateTime = p.getUpdateTime;
if(p.total<1){
retrun;
}
第二步:更新庫(kù)存
update XXX set total =total – 1 , updateTime=now() where productId = 123 and updateTime = lastUpdateTime ;
關(guān)鍵點(diǎn)在于判斷影響行數(shù)是否為0。
如果為0 ,則說(shuō)明執(zhí)行sql的時(shí)候,已經(jīng)沒(méi)庫(kù)存了。
核心在于 where 中的 updateTime = lastUpdateTime 。
lastUpdateTime 是上一步我們查詢的修改之前的更新時(shí)間。如果其他線程修改并提交了事務(wù),那么數(shù)據(jù)庫(kù)此刻的UpdateTime 必定和我們之前查詢出來(lái)的不一致,所以where返回空,也不會(huì)修改數(shù)據(jù)。
建議使用:
update XXX set total =newTotal , updateTime=now() where productId = 123 and total=oldTotal and updateTime = lastUpdateTime ;
具體原因同3
3.單純的sql語(yǔ)句
update XXX set total =total – 1 where productId = 123 and total>=1 。
本質(zhì)是在 數(shù)據(jù)庫(kù)層面 針對(duì) 數(shù)量進(jìn)行增量修改(set total =total – 1 ),以及修改的時(shí)候,判斷是否可以進(jìn)行庫(kù)存扣減( total>=1 )
延伸閱讀:
二、信息抽取是什么
信息抽?。╥nfromation extraction)信息抽取是一種自動(dòng)化地從半結(jié)構(gòu)化和無(wú)結(jié)構(gòu)數(shù)據(jù)中抽取實(shí)體、關(guān)系以及實(shí)體屬性等結(jié)構(gòu)化信息的技術(shù)。關(guān)鍵技術(shù)包括:實(shí)體抽取、關(guān)系抽取和屬性抽取。
1、實(shí)體抽取,也稱(chēng)為命名實(shí)體識(shí)別(named entity recognition,NER),是指從文本數(shù)據(jù)集中自動(dòng)識(shí)別出命名實(shí)體。
當(dāng)前主流技術(shù)為面向開(kāi)放域(open domain)的實(shí)體抽取。
2、關(guān)系抽取,為了得到語(yǔ)義信息,從相關(guān)語(yǔ)料中提取出實(shí)體之間的關(guān)聯(lián)關(guān)系,通過(guò)關(guān)系將實(shí)體聯(lián)系起來(lái),才能夠形成網(wǎng)狀的知識(shí)結(jié)構(gòu)。其技術(shù)研究已經(jīng)從早期的“人工構(gòu)造語(yǔ)法和語(yǔ)義規(guī)則”(模式匹配),“統(tǒng)計(jì)機(jī)器學(xué)習(xí)”發(fā)展到“面向開(kāi)放域的信息抽取方法”與“面向封閉領(lǐng)域的方法”相結(jié)合。
3、屬性抽取,目標(biāo)是從不同信息源中采集特定實(shí)體的屬性信息,如針對(duì)某個(gè)公眾人物,可以從網(wǎng)絡(luò)公開(kāi)信息中得到其昵稱(chēng)、生日、國(guó)籍、教育背景等信息。采用數(shù)據(jù)挖掘的方法直接從文本中挖掘?qū)嶓w屬性和屬性值之間的關(guān)系模式,據(jù)此實(shí)現(xiàn)對(duì)屬性名和屬性值在文本中的定位。