后端服务器如何简单的避免重复提交?
2015-10-28 17:37
239 查看
业务场景:用户点击购买后,修改订单状态,修改用户账户余额,并添加用户消费记录。
分析:这里在同一个事务里有三个动作,两个是更新,一个是添加。如果这时候在更新完出现并发情况,那么用户消费记录可能会多出一条,用户账户余额也可能出现错误。那么该如何防止呢?在修改前查询订单状态判断是否已经修改过明显不能解决问题,因为并发可能发生在查询之后。
解决思路:数据库一般默认update操作会占有一个行级锁,当第一次请求的事务还未结束时,第二次重复请求是无法修改这条记录的。我们让修改操作都加上一个修改前的条件判断,这样第二次请求再来修改的时候会发现修改不成功,这时回滚事务即可避免并发。
解决办法:在修改订单时增加一个判断(判断其应该是未支付的订单),然后返回更新的记录条数,如果为0则抛出异常,回滚当前事务。
sql语句如下:
update order set status = 1 where oid = 1 and status = 0;
在mybatis中可以获取记录更新的条数
int update(Map map);
分析:这里在同一个事务里有三个动作,两个是更新,一个是添加。如果这时候在更新完出现并发情况,那么用户消费记录可能会多出一条,用户账户余额也可能出现错误。那么该如何防止呢?在修改前查询订单状态判断是否已经修改过明显不能解决问题,因为并发可能发生在查询之后。
解决思路:数据库一般默认update操作会占有一个行级锁,当第一次请求的事务还未结束时,第二次重复请求是无法修改这条记录的。我们让修改操作都加上一个修改前的条件判断,这样第二次请求再来修改的时候会发现修改不成功,这时回滚事务即可避免并发。
解决办法:在修改订单时增加一个判断(判断其应该是未支付的订单),然后返回更新的记录条数,如果为0则抛出异常,回滚当前事务。
sql语句如下:
update order set status = 1 where oid = 1 and status = 0;
在mybatis中可以获取记录更新的条数
int update(Map map);
相关文章推荐
- 控制反转(IoC)与依赖注入(DI)
- Oracle 12.1.0.1 GI+DATABASE打PSU
- Lifecycle(生命周期)和Phase(阶段)
- DNS服务
- 修改主机域名
- JQUERY实现判断鼠标往上滚往下滚的功能。
- JQUERY实现判断鼠标往上滚往下滚的功能。
- textare的固定大小的属性
- centos7 安装 oracle 11G
- Linux常用命令版本CentOS7.x
- C# HttpWebRequest与HttpWebResponse详解
- iOS —— IOS8适配
- C#泛型与委托
- FGPA 双向 IO 自动方向控制
- 手动向IIS注册.net框架组件
- laravel 部分路由取消csrf
- JAVA----关键字用法
- Laravel框架的体系结构
- MyReport报表系统(三)
- 转