spring 事物配置的错误

       今天在在使用spring Quartz做定时任务的时候,在保存数据的时候,发现怎么也都是保存失败,异常信息如下:

      Caused by:
java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed


 
因为我是直接使用dao 的方法executeSql执行原生的sql。然后百度了下。具体的问题大概是说我在配置事物的时候没有给execute这个方法中加事物。ok,我二话不说就加上呗。
 <tx:method name="execute*" propagation="REQUIRED"/>

     重启了下程序,继续跑了下,还是爆出开始的那个问题。继续百度,然后有盆友说是把<tx:method name="*" read-only="true"/>直接去掉,ok,这个还真是能解决掉那个问题异常。此时保存数据成功。但是不能是停留在解决问题的层面,必须要搞清楚问什么导致了这个莫名其妙的错误啊。  
 再寻思下,查了下资料。终于知道了这个问题的根本原因:
错误的原因就在上面的Spring声明式事务里。执行Service类的outInvoke()方法时,spring加载配置文件,由于它的方法名与所有的特殊配置都不匹配,因此,会应用第一个声明式事务:
    <tx:method name="*" read-only="true"/>
因此,SpringAOP创建了一个只读的数据库连接和事务。然后,调用Service类的execute方法,尽管这个时候我是为execute这个方法加上了事物。但是也会查找上面的事务配置,匹配:
<tx:method name="execute*" propagation="REQUIRED"/>
SpringAOP会去得到数据库连接和设置事务。由于在本地线程变量中已经找到了前面提供的只读连接,就会直接使用这个数据库连接,并在其上设置事务。最后,调用commonDao类的execute方法。由于使用的是只读连接,执行语句,就发生了上面的错误:
      Caused by:
java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

总结下问题:开始我不能定位到问题的所在是因为程序在前几天在服务器那边还能愉快的跑着,我在想不可能现在在本地跑就不行了。程序是不会骗人的。所以我仔细看了下源码,发现定时任务开始调用的是doService方法,那就是了,然而程序是有为doService方法加上了事物的。可是我那时候在本地测试的直接调用的outInvoke方法,所以问题就来了。当然此时,去掉了配置文件的为execute 方法加上的事物配置。


  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值