在xml里注册modify是有事务的方法
<tx:method name="modify*" propagation="REQUIRED"
rollback-for="Exception" />然后在service中有 login  modify方法在login中调用modify:
if(!passwordInDB.equals(password)){
modifyUserLoginNum("1",userName);
throw new SystemException("密码错误!");
}目前会报:Connection is read-only. Queries leading to data modification are not allowed
如果把login加入到事务中,则不会报错。
但是当密码不符时候,会回滚,也就是说 登录次数也不会记录到数据库中,
请问这是何种情况,我应该如何才能解决。

解决方案 »

  1.   

    你配的是只读事务,只读事务只能在select操作上用
    其他更新操作必须设置readOnly=false
      

  2.   

    tx:advice  楼主看看你的applicationContext里的配置 方法名要规范
      

  3.   


    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>

    <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />
    <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception" />
    <tx:method name="update*" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="modify*" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="approval*" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="disApproval*" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="getAppSerialNumber" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="submitRouterSelect" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="submitRouterGroupSelect" propagation="REQUIRED"
    rollback-for="Exception" />
    <tx:method name="*" read-only="true" />
    </tx:attributes>
    </tx:advice>
      

  4.   

    配置没问题啊,在service里面的modifyPWD方法是可以使用的。
    但是login调用modify方法就不可以。
    应该是事务传递的问题,但我不晓得还需要修改什么地方。
      

  5.   

    出错的modify是在login下的。。所以也不行 
    楼主可以试试多加一个 
     <tx:method name="login*" propagation="REQUIRED" rollback-for="Exception" />这样应该不会错了
      

  6.   

    嗯,加上login的话,当密码出错的时候,事务会回滚。
    这样也就更新不到数据库里登录次数了。
      

  7.   

    如何解决么就是修改配置文件啊 或者 修改方法名 自己看着办呗
    因为你定义了 * 是read-only的  所以你对数据库有操作的方法名 都应该符合你写的过滤
      

  8.   

    这 我是没看懂。。刚才看了下 发现少看了最后几行 现在懂你的问题了 不抛异常行不行?直接return掉。。
      

  9.   

    抛异常到前台捕获后,报给用户是密码输入错误。如果rentun,怎么弄呢
      

  10.   

    if(!passwordInDB.equals(password)){
    modifyUserLoginNum("1",userName);
    throw new SystemException("密码错误!");

    擦,你都抛异常了,不回滚就不正常了。你需要的是把modifyUserLoginNum("1",userName);这个操作,也就是计数器管理提到事务外面。很明显你也不希望出错时计数器回滚,因此他完全没必要放到事务中。