在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加入到事务中,则不会报错。
但是当密码不符时候,会回滚,也就是说 登录次数也不会记录到数据库中,
请问这是何种情况,我应该如何才能解决。
<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加入到事务中,则不会报错。
但是当密码不符时候,会回滚,也就是说 登录次数也不会记录到数据库中,
请问这是何种情况,我应该如何才能解决。
其他更新操作必须设置readOnly=false
<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>
但是login调用modify方法就不可以。
应该是事务传递的问题,但我不晓得还需要修改什么地方。
楼主可以试试多加一个
<tx:method name="login*" propagation="REQUIRED" rollback-for="Exception" />这样应该不会错了
这样也就更新不到数据库里登录次数了。
因为你定义了 * 是read-only的 所以你对数据库有操作的方法名 都应该符合你写的过滤
modifyUserLoginNum("1",userName);
throw new SystemException("密码错误!");
}
擦,你都抛异常了,不回滚就不正常了。你需要的是把modifyUserLoginNum("1",userName);这个操作,也就是计数器管理提到事务外面。很明显你也不希望出错时计数器回滚,因此他完全没必要放到事务中。