mysql 投票问题 事务

需要查看用户是否已经投票,如果已经投票,则不插入数据,如果未投票,则插入数据。在并发的条件下,有可能用户在同一时刻都查询到未投票,然后导致插入多条数据。

针对这样的情况,有什么好的解决方案么?
目前所知,用数据库的事务并不会对select进行加锁,所以事务可能并不能解决这类问题?
难道只有select for update这类型的可以么?有什么什么主流一点的方法

阅读 2.2k
2 个回答

用户id和投票id做成联合的唯一键即可.

CREATE TABLE user_vote_record (
    user_id INT,
    vote_id INT,
    UNIQUE KEY uk_user_vote (user_id , vote_id)
);

考虑并发期间锁的问题。投票不应加锁。会导致投票失败。
1、你可以实用队列,将投票信息加入到redis内,随后再同步到mysql内。
2、投票数量为独立的int字段。仅仅计数即可。
3、从redis读,往mysql内存。不过如果没有那么大的并发,建议不必多此一举。
总结下来流程基本如下
php -> 队列 -> redis -> mysql <- redis <- php <- 用户

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题