鍍金池/ 問答/數(shù)據(jù)庫/ mysql 投票問題 事務(wù)

mysql 投票問題 事務(wù)

需要查看用戶是否已經(jīng)投票,如果已經(jīng)投票,則不插入數(shù)據(jù),如果未投票,則插入數(shù)據(jù)。在并發(fā)的條件下,有可能用戶在同一時(shí)刻都查詢到未投票,然后導(dǎo)致插入多條數(shù)據(jù)。

針對(duì)這樣的情況,有什么好的解決方案么?
目前所知,用數(shù)據(jù)庫的事務(wù)并不會(huì)對(duì)select進(jìn)行加鎖,所以事務(wù)可能并不能解決這類問題?
難道只有select for update這類型的可以么?有什么什么主流一點(diǎn)的方法

回答
編輯回答
維他命

用戶id和投票id做成聯(lián)合的唯一鍵即可.

CREATE TABLE user_vote_record (
    user_id INT,
    vote_id INT,
    UNIQUE KEY uk_user_vote (user_id , vote_id)
);
2018年1月24日 04:12
編輯回答
來守候

考慮并發(fā)期間鎖的問題。投票不應(yīng)加鎖。會(huì)導(dǎo)致投票失敗。
1、你可以實(shí)用隊(duì)列,將投票信息加入到redis內(nèi),隨后再同步到mysql內(nèi)。
2、投票數(shù)量為獨(dú)立的int字段。僅僅計(jì)數(shù)即可。
3、從redis讀,往mysql內(nèi)存。不過如果沒有那么大的并發(fā),建議不必多此一舉。
總結(jié)下來流程基本如下
php -> 隊(duì)列 -> redis -> mysql <- redis <- php <- 用戶

2017年7月20日 19:05