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

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

现在有个需求,论坛贴子的回复都会显示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


对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里应该提供的有相关中间件可以实现。

【热门文章】
【热门文章】