有一个java方法methodA();数据库中有一个字段fieldA,记录这当前的有多少个methodA()在执行;有一个常量MAX,记录允许同时最多有几个method()在执行。
    在进入这个方法后,需要取得fieldA的值与MAX比较,如果fieldA小于MAX,则执行这个方法,并且fieldA要加一;否则写日志,退出方法;methodA()执行后,写日志,对fieldA字段进行减一操作,退出方法。    现在的问题是:一旦方法运行中出现异常(执行到某条语句出错,fieldA未加一,或未减一),可能会出现fieldA的值,与实际运行中的methodA()的个数出现不一致。请问各位大侠,此类问题如何解决,多谢,多谢。

解决方案 »

  1.   

    try{
    }catch(){
    }
    finally{}
      

  2.   

    在finally中描述应该做的加减法,是否要做,可以加判断
      

  3.   

    一旦方法运行中出现异常(执行到某条语句出错,fieldA未加一,或未减一),可能会出现fieldA的值,与实际运行中的methodA()的个数出现不一致。请
    ---------
    捕获异常,使fieldA的值保持正确的值即可。
      

  4.   

    首先,这个问题不存在同步的问题,因为数据库锁机制保证了只有一个线程能读到
    fieldA(当然,你用的是主流数据库,隔离级别至少是CS,游标稳定性),楼上的兄弟们
    说得对,LZ在finally中必须将fieldA在一个事务写回到数据库中.是加还是减LuckBall
    说得对,你在方法中做一个局部变量标志初始化成加一标志,catch中置成减一标志.
    finally一判就知道了,记得在finally中将计算后fieldA写回数据库,提交事务哦.
      

  5.   

    方法前面用 Synchronization 修饰