这两天报过来个bug,和大家讨论了解决方案后,觉得这正是SRP一个广义上的实例,值得记录一下。
先讲一下业务情况:
数据库中有一些存储过程,目的是生成报表数据。应用服务器上有一个Java写的Timer,定期(通常是一周,一月或一年末)调用这些存储过程,更新报表数据。这些存储过程中任何一个都能被顺序执行任意多次而不会出错,但如果同一个存储过程的两个实例并发执行会产生错误结果。
先前的处理方法基于以下两个考虑:
1)需要一个统一框架控制并发问题,不用在每个存储过程内部考虑并发问题。
2)出现意外情况时,系统能够自动恢复。这样不会在半夜两点钟被电话叫醒去修BUG。
基于以上的考虑,Java端Timer实现以下:























在DB中有一张Lock表,包括以下字段(Name,State),后台的Java Scheduler用这张表中相应行实现锁。每次Scheduler重启时会重置所有的程序运行状态为false,当一个存储过程被调用时,Java Scheduler检查此程序状态是否为正在运行,如果是则不作。如果不是则置状态为运行->运行->重置状态。
用户反映,某些报表中数据异常大,看起来似乎是翻倍了。也就是说,还是有某些存储过程被并发执行了。
那么,问题出在哪儿呢?
...太晚了,明天继续吧