世界真奇妙,虫虫天天笑;若只看表象,保你没头脑!

这次这个BUG,是帮助一位同事调试的。

同事来找我,说他遇到一个问题,就是在本地调试的时候,都没问题,但是一部署到服务器上,就执行超时。

经过我简单了解,原来这是这样的一个业务场景:

客户希望在A系统中更新某记录的时候,同时更新B系统的一条数据。由于A系统是一个商业系统,没有源代码,而且界面的二次开发接口也没有,所以只能考虑对数据库字段增加Trigger,通过Trigger调用本地的一个EXE,去执行一个WebService,更新另外一个数据库数据。

这个设计本身没有什么问题。可问题出在他的实现细节上。更新的过程,显然是要把A系统的数据传递给B系统,而不是简单的通知。同事在实现的时候,为了传递数据,就把当前记录的ID传递过去,在WebService中,再读取数据库,取得实际所要用的所有数据。这样需要多少数据,都不需要修改接口。

可是,大家可能也发现了,在这个过程中,A系统当前记录的Trigger还在Update中,如果数据库连接过来访问这条记录,是被锁死的,只能等待。陷入了一个死循环。这就会导致最后的超时表现。

好了,知道了原理,修改起来就简单了。只要吧该传递的参数,在调研Webservice之前,就通过参数的形式传递过去,就不会出现这种调用了。

这个案例同时也告诉我们,系统独立(不依赖)设计的重要性。