您好,匿名用户
随意问技术百科期待您的加入

如何设计才能保证论坛楼层不重复?

0 投票

现在有个需求,论坛贴子的回复都会显示xx楼,比如:

20楼 Jacky
楼主好人,1024
[回复此楼]

如果用户John点了[回复此楼],那么这个回复需要显示成:

21楼 John
@Jacky 回复20楼
1024
[回复此楼]

按我说的这种需求,需要把楼层记在数据库
Table Reply:
reply_id
user_id
content
floor : 本条回复的楼层
reply_to_user_id : 对应@User
reply_to_floor : 对应回复xx楼

现在的问题就是有什么简便的方式记录楼层,能保证并发情况下多个用户同时回复,楼层floor这个字段能正确设置而不会出现楼层重复?
PS:用的Django

用户头像 提问 2013年 12月2日 @ Sona 上等兵 (306 威望)
分享到:

1个回答

0 投票

对Django了解不多,不知道自带的ORM能否实现类似锁机制。

如果你用Mysql的话,可以这么做:

  1. 给主贴表article加一个楼数/回复数 floor_count,新主贴其值应该是0
  2. 每次更新前先获取floor_count的值,设为fc_last
  3. 用REPLACE INTO article 当锁,获取修改行数an
  4. 如果第3步返回的修改行数an大于0,认为得到锁,在reply表中插入新回复数据,其中floor=fc_last+1,楼数即之前的fc_last+1;否则若an小于等于0,则回到第2步,重试之

其中第3步的SQL如下:

REPLACE INTO article SET floor_count=fc_last+1 WHERE id=article_id AND floor_count=fc_last

这是一个完全用MySQL做CAS锁的办法。不过建议还是用memcached或者其他应用级的数据共享锁来做,Django里应该提供的有相关中间件可以实现。

用户头像 回复 2013年 11月28日 @ Cassiopeia 上等兵 (317 威望)
提一个问题:

相关问题

0 投票
1 回复 71 阅读
用户头像 提问 2012年 12月1日 @ Syndra 上等兵 (331 威望)
0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Shen 上等兵 (318 威望)
+1 投票
1 回复 55 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...