开发者社区> 问答> 正文

点赞功能与异常捕获处理

最近一直做一个关于"点赞"功能的服务器端(整个服务器功能的一个小部分),基本的需求主要是这样的:
用户发表了一个状态,浏览者可以点赞,但是点赞只能点一次.如果浏览者点了第二次,客户端就说"您已经点过一次赞了哟".
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什么异常么?

展开
收起
落地花开啦 2016-02-18 16:24:05 3247 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

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

    2019-07-17 18:44:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载