关于数据库的一道笔试题

recored 2016-12-16 01:34:24
假设有A、B两个人同时用同一个账号分别下金额为50和60的订单,但是账号余额只有100,如果不做处理,他们下订单都会成功。问:做一个怎样的简单处理。
...全文
437 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdsnhan 2016-12-19
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:

-- 只有一个会成功

-- 会话1 
update t set num = num - 50 where num >= 50 ;
-- 会话2
update t set num = num - 60 where num >= 60 ;

这个方法很严密,也很简单
com_jia 2016-12-16
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:

-- 只有一个会成功

-- 会话1 
update t set num = num - 50 where num >= 50 ;
-- 会话2
update t set num = num - 60 where num >= 60 ;

两个都会成功,假设数据库只要一条数据的话,一个修改了会话修改了1条数据,一个会话修改了0条数据。
com_jia 2016-12-16
  • 打赏
  • 举报
回复
引用 3 楼 cnceohjm 的回复:
[quote=引用 2 楼 wmxcn2000 的回复:]

-- 只有一个会成功

-- 会话1 
update t set num = num - 50 where num >= 50 ;
-- 会话2
update t set num = num - 60 where num >= 60 ;

[/quote] 将这个字段加上约束,不能小于零就行,那么 update t set num = num - 50 where id=user_id; update t set num = num - 50 where id=user_id; 这两个SQL对应的会话一个会成功,另一个会报违反该约束的错误,违反该约束的时候程序就可以返回余额已不足的提示,同时用户还可以重新查看最新账户余额。 如果按照水果给的SQL,第一没有考虑用户ID,会扣所有用户的钱,另一方面程序得去判断UPDATE到底更新了没有,说白了就是你执行语句后因为没有报错,所有根本不知道到底扣没有扣钱,得去检验语句执行结果,要不然都会成功。
H_Gragon 2016-12-16
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:

-- 只有一个会成功

-- 会话1 
update t set num = num - 50 where num >= 50 ;
-- 会话2
update t set num = num - 60 where num >= 60 ;

卖水果的net 2016-12-16
  • 打赏
  • 举报
回复

-- 只有一个会成功

-- 会话1 
update t set num = num - 50 where num >= 50 ;
-- 会话2
update t set num = num - 60 where num >= 60 ;

moscot_wu 2016-12-16
  • 打赏
  • 举报
回复
行级锁,做一个锁啊

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧