当前位置:编程学习 > JAVA >>

spirng 事务的传递调用问题

在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加入到事务中,则不会报错。
但是当密码不符时候,会回滚,也就是说 登录次数也不会记录到数据库中,
请问这是何种情况,我应该如何才能解决。 --------------------编程问答-------------------- 你配的是只读事务,只读事务只能在select操作上用
其他更新操作必须设置readOnly=false --------------------编程问答-------------------- tx:advice  楼主看看你的applicationContext里的配置 方法名要规范 --------------------编程问答--------------------

<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>
--------------------编程问答-------------------- 配置没问题啊,在service里面的modifyPWD方法是可以使用的。
但是login调用modify方法就不可以。
应该是事务传递的问题,但我不晓得还需要修改什么地方。 --------------------编程问答-------------------- 出错的modify是在login下的。。所以也不行 
楼主可以试试多加一个 
 <tx:method name="login*" propagation="REQUIRED" rollback-for="Exception" />

这样应该不会错了 --------------------编程问答-------------------- 嗯,加上login的话,当密码出错的时候,事务会回滚。
这样也就更新不到数据库里登录次数了。 --------------------编程问答-------------------- 是的 所以还是要方法命名规范   --------------------编程问答-------------------- 请问如何解决这个问题呢 --------------------编程问答-------------------- 。。。如何解决么就是修改配置文件啊 或者 修改方法名 自己看着办呗
因为你定义了 * 是read-only的  所以你对数据库有操作的方法名 都应该符合你写的过滤 --------------------编程问答-------------------- 楼上是没看清我的问题吧。
--------------------编程问答--------------------
引用 10 楼  的回复:
楼上是没看清我的问题吧。

这 我是没看懂。。刚才看了下 发现少看了最后几行 现在懂你的问题了 

不抛异常行不行?直接return掉。。 --------------------编程问答-------------------- 抛异常到前台捕获后,报给用户是密码输入错误。如果rentun,怎么弄呢 --------------------编程问答-------------------- 好烦。。。597422613 加我qq吧  --------------------编程问答-------------------- --------------------编程问答-------------------- if(!passwordInDB.equals(password)){
modifyUserLoginNum("1",userName);
throw new SystemException("密码错误!");

擦,你都抛异常了,不回滚就不正常了。

你需要的是把modifyUserLoginNum("1",userName);这个操作,也就是计数器管理提到事务外面。很明显你也不希望出错时计数器回滚,因此他完全没必要放到事务中。 --------------------编程问答-------------------- 简单的说,把你的“计数器加1”操作与“登录校验(成功后计数器重置)”操作不要放到一个事务中。 --------------------编程问答--------------------
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,