SRP的一个实例(1)

这两天报过来个bug,和大家讨论了解决方案后,觉得这正是SRP一个广义上的实例,值得记录一下。

先讲一下业务情况:

数据库中有一些存储过程,目的是生成报表数据。应用服务器上有一个Java写的Timer,定期(通常是一周,一月或一年末)调用这些存储过程,更新报表数据。这些存储过程中任何一个都能被顺序执行任意多次而不会出错,但如果同一个存储过程的两个实例并发执行会产生错误结果。

先前的处理方法基于以下两个考虑:

1)需要一个统一框架控制并发问题,不用在每个存储过程内部考虑并发问题。

2)出现意外情况时,系统能够自动恢复。这样不会在半夜两点钟被电话叫醒去修BUG。

基于以上的考虑,Java端Timer实现以下:

 

 

//Reset all flags when the scheduler restart
public void Scheduler{
   ResetAllFlag(false
);
}

//Task to run
public void run(String storedProcedureName, Param[] params)...{
    
bool isRunning=getRunningFlagFromDB(storeProcedureName);
    
//last task has finished;
    if (isRunning)...{
        
return();
     }

     
//else{
        setRunningFlagToDB(storedProcedureName,true);
        updateRunningTimeToDB(storedProcedureName);
        runStoredProcudureInDB(storedProcedureName,
params);
        setRunningFlagToDB(storedProcedureName,
false);   
             }

     }
}

 

在DB中有一张Lock表,包括以下字段(Name,State),后台的Java Scheduler用这张表中相应行实现锁。每次Scheduler重启时会重置所有的程序运行状态为false,当一个存储过程被调用时,Java Scheduler检查此程序状态是否为正在运行,如果是则不作。如果不是则置状态为运行->运行->重置状态。

用户反映,某些报表中数据异常大,看起来似乎是翻倍了。也就是说,还是有某些存储过程被并发执行了。

那么,问题出在哪儿呢?

...太晚了,明天继续吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值