没错,这周项目又出现的问题。
这次的问题是当外联的处理系统反盘给我们两条信息时候,只更新了第一条,没有更新第二条。或者说可能是第二条也更新了第一条。
因为两次反盘的请求相隔时间是毫秒级的。再次想到了并发的问题,但是当看代码后发现,两次请求并不会有并发的问题。但是不能说每次都把问题归结于并发,然后解决方案就是锁表操作。
第一次问题可以用锁表来预防并发的前提是,系统的交易量不大,每周可能才会有几十次的交互。但是这一次不行,因为有系统中有按月的跑批操作,在某一天的时候会频繁和外联系统交互,所以这一次要换解决方案了。
多次观察代码后发现由于逻辑特别复杂,方法中嵌套方法导致有的参数可能在嵌套的方法中会做出修改,又由于方法之间传递的是以对象为载体,更不容易确定其中的属性是否在嵌套方法中修改(这里可能看一下参数传递部分),在讨论之后的解决方案是
1 当传递的参数不多的时候,用基本数据类型,或者String等方式传递,不放入实体对象中。
2 当不得不用实体传递时,提前将可能用到的属性值放入对应的数据类型中。
public String getName(User user) {
String userId=user.getUserId;
String userAccountId=user.getUserAccountId
.
.
.
.
.
Account account=getAccount(userId,userAccountId);
}