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