技术讨论:一个关于点赞功能与异常捕获处理的迷惑

徐建兴 发布于 2013/11/21 14:46
阅读 1K+
收藏 1

最近一直做一个关于"点赞"功能的服务器端(整个服务器功能的一个小部分),基本的需求主要是这样的:

用户发表了一个状态,浏览者可以点赞,但是点赞只能点一次.如果浏览者点了第二次,客户端就说"您已经点过一次赞了哟".

mysql的sql语句是这样做的:

create  table status_footprint_db(
    sid int unsigned  not null,
	uid int unsigned not null,
	like_this varchar(1)    check   ( like_this in('0','1')),  
	primary key(aid,uid,like_this),
	
	foreign key(sid) references status_db(sid) on delete cascade on update cascade
 );



现在问题来了.如何做到判断用户是否点赞呢?

有两种做法,第一种做法是在用户点赞的时候,先查询一下,如果说点过赞了,就直接返回.如果说没有点赞,就插入点赞.

第二种做法是直接插入,因为向上面的数据库表,元组是不允许一样的,这样在插入数据,如果已经点赞了.mysql就会不允许插入.excuteupdate就会返回0,这样就表示已经点过赞了.

其实我更想说的是第二种情况所引申出来的情况.excuteupdate等于0可能是多种情况,不一定"我已经点过赞"的原因.也有可能是like_this不是0或者1.这样,本来我没有点赞,但是客户端还是告诉我"您已经点过赞了".有没有这样一种方法:

根据具体的异常来返回给客户端不同的值?

比如陌陌就经常出现这种情况:更新个人资料的时候,有时候是更新成功了的.但是客户端还是给你说:更新失败,请检查连接.

接着陌陌的问题.假设用户在更新数据的时候,服务器出于某种原因,会报出两个异常:

一个是sql异常.说明数据库中间没有插入你的数据,客户端说"数据插入失败,重试一下".

另外一个是其他的一个异常,但是数据库中间已经保存了你的数据.,客户端说"服务器发生未知错误,但是您的数据已经更新成功"

对于点赞的问题:根据不同的异常返回两个值:

1.您已经点过赞了

2.点赞失败..服务器出现了某种错误.

以前我处理异常就是try catch throw finally,只要出现异常,就给客户端返回"一个服务器错误"的提示.客户端发现有这句话"就提醒"更新失败,请重试".于是用户们就重试了一下.结果就出现跟陌陌差不多的错误,数据库更新成功了.由于用户不断重试,表里面有很多重复的数据.

还是老问题啊!这么多异常,如和根据异常向客户端返回不同的值呢?是不是getCause.equals什么异常么?






加载中
0
梅开源
梅开源
查询的时候就可以查出来这个赞当前用户有没有点过,点过的话写个cookie或者在页面里输出点隐藏数据,再点赞就直接js判断下,拒绝执行。否则向服务器发送插入请求。服务器对插入请求进行校验后插入成功返回状态码1否则其他错误码,ajax得到1则提示成功,否则各种提示。
0
0
徐建兴
徐建兴

引用来自“梅开源”的答案

查询的时候就可以查出来这个赞当前用户有没有点过,点过的话写个cookie或者在页面里输出点隐藏数据,再点赞就直接js判断下,拒绝执行。否则向服务器发送插入请求。服务器对插入请求进行校验后插入成功返回状态码1否则其他错误码,ajax得到1则提示成功,否则各种提示。
客户端是手机....
0
JieZhiZ
JieZhiZ

你想复杂了

当点击“赞”时候,服务器就判断下是否有这条记录就行。也就是你的第一种做法,第二种做法有些复杂。

返回顶部
顶部