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