现在出现了一个充值问题,一直困扰了好几天,希望道友给分析一下
需求是这样的,我是限制充值金额1000,在service层中使用if 判断,
如果小于1000直接返回,但是现在发现小于1000的也有成功的充值记录。
很是费解
项目用的是ssm,什么原因出现的这种bug呢,希望有这方面经验的朋友不惜赐教。多谢
controller层代码:
service层代码如下:
BigDecimal fmoney = new BigDecimal(paramMap.get("money").toString());//设置充值金额
String property = PropertiesUtil.getProperty("rechargeMoney");//property文件中取值
if(null != property && !"".equals(property)){
BigDecimal rechargeMoney=new BigDecimal(property);
System.err.println(NumberUtils.greaterThan(fmoney, rechargeMoney));
if(!NumberUtils.greaterThan(fmoney, rechargeMoney)){
response.setDescription("充值金额不能小于1000元");
return response;
}
}
多线程并发。
只是加个if判断,是不够的。
你可以了解下,锁机制
估计是存在多线程并发不安全的变量,检查一下代码。
简单的方法可以先把方法设置为synchronized做同步,也可以用Lock对象
最好贴一下代码看看
通过SQL锁定或者同步的方式,避免这个问题。
可以用select for update nowait来 防止并发操作。语句会锁定记录或列,这时其他用户可以查询但不能修改数据。
等你断开连接或commit后,锁就释放了。其他用户可以修改该记录。
http://blog.csdn.net/zhuangyangoal/article/details/5543248
你把业务操作放到controller去处理,service里面只写数据库操作方法