问题描述:
在service层调用dao.update(xxx);后发现数据并没有更新。
先说结论:
我遇到的都是因为service层的方法名与 spring的配置文件(一般是applicationContext.xml)中 事务配置(tx:advice) 的方法名不匹配。
如下(applicationContext.xml),指明service包下的类所有以“save”、“add”、“del”、“update”这四种其中一个为开头的方法名才能读写数据库
<!-- 声明一个事务管理器来管理sessionFactory --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 建立一个切面,指明什么时候要调用事务管理器 --> <aop:config> <aop:pointcut id="productServiceMethods" expression="execution(* com.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/> </aop:config> <!-- 为事务管理器做某些说明,指明一些方法的权限(只读OR读写) --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" read-only="true"/> <!-- 以下方法都是可能涉及修改的方法,就无法设置为只读 --> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
再说问题特征:
暂时知道的,可以从3个方面判定。
1、最简单直接:也就是上面的结论,看看service的方法是否匹配事务配置。
2、断点查看程序是否确实执行了update语句,而直到请求结束也还没有发sql。
3、麻烦但有效:把日志级别调到debug,搜索 “Creating new transaction with name”, 看看这句日志最后面是不是有“readOnly”。