鍍金池/ 問(wèn)答/PHP  數(shù)據(jù)庫(kù)/ 關(guān)于并發(fā)的問(wèn)題

關(guān)于并發(fā)的問(wèn)題

php后臺(tái)需要往mysql數(shù)據(jù)庫(kù)表里插入記錄,這張表的id是主鍵但不是自增長(zhǎng)的,需要通過(guò)某種規(guī)則計(jì)算出來(lái),比如先查看當(dāng)天創(chuàng)建的記錄有N個(gè),那么這次的id就設(shè)為xxxN+1.如果訪問(wèn)量比較大情況下,可能多個(gè)請(qǐng)求先獲取到的記錄個(gè)數(shù)相同,那么就有可能生成相同的id,插入數(shù)據(jù)庫(kù)的話就會(huì)報(bào)錯(cuò),這種情況應(yīng)該如何處理呢?

回答
編輯回答
壞脾滊

1、如果業(yè)務(wù)需求一致性很強(qiáng)的話,加鎖,或者線程阻塞保證數(shù)組的強(qiáng)一致性
2、使用非關(guān)系型數(shù)據(jù)庫(kù)比如redis或者mongodb或者mecache
3、使用隊(duì)列

2017年2月4日 13:37
編輯回答
赱丅呿

Redis的incr可以解決

2018年5月25日 13:11
編輯回答
瘋浪

建議id做保留字段,如你所說(shuō)的規(guī)則,將日期做一個(gè)字段,當(dāng)天的記錄號(hào)作一個(gè)字段,建立聯(lián)合唯一索引

redis來(lái)計(jì)數(shù)當(dāng)天的記錄數(shù),如果并發(fā)量較大,可以考慮隊(duì)列消耗

2018年2月16日 10:38
編輯回答
玩控

第一種方式:改變主鍵的規(guī)則,換成自增或者其他隨機(jī)算法生成這種更簡(jiǎn)單的形式。
第二種方式:?jiǎn)为?dú)維護(hù)主鍵的生成與使用,可以先提前按照原來(lái)的規(guī)則生成一定數(shù)量的主鍵入庫(kù),每次插入記錄時(shí)先從其中獲取一個(gè)主鍵,使用后將其銷毀,但是需要注意的是適當(dāng)?shù)臅r(shí)機(jī)去補(bǔ)充主鍵,其實(shí)這就是建立了一個(gè)動(dòng)態(tài)的數(shù)據(jù)池。

2018年8月14日 14:11
編輯回答
咕嚕嚕

鎖數(shù)據(jù)庫(kù)并不是一個(gè)好辦法,可能在并發(fā)時(shí)導(dǎo)致提交失敗。
建議還是修改數(shù)據(jù)庫(kù)架構(gòu),把當(dāng)前主鍵改為unique索引。

2017年6月9日 21:10