问题描述
配置文件里如下配置的事物<props><propkey="add*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="create*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="update*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="config*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="delete*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="save*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="do*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="register*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="remove*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="start*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="pause*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="get*">PROPAGATION_REQUIRED,readOnly</prop></props>
如果我在BO调用了两个DAO的方法,第一个方法正常,第二个在DAO层抛了异常,但是没有向BO层抛,然后我发现程序可以正常跑下去,而且第一个操作数据库并没有因为第二个抛异常而回滚?为什么呀??
解决方案
解决方案二:
可能楼主事务管理是在dao层控制的(也就是粒度在dao层方法),而不是在bo控制的。楼主没有说清楚事务控制粒度,以上也是我的臆测。如果是这样呢,bo调用的两个dao方法,只会回滚发生异常的方法,而成功的那个dao方法是另一个事务控制,自然不会回滚。
解决方案三:
引用1楼redcenter的回复:
可能楼主事务管理是在dao层控制的(也就是粒度在dao层方法),而不是在bo控制的。楼主没有说清楚事务控制粒度,以上也是我的臆测。如果是这样呢,bo调用的两个dao方法,只会回滚发生异常的方法,而成功的那个dao方法是另一个事务控制,自然不会回滚。
<beanid="jtaTxAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><propertyname="advice"><beanclass="org.springframework.transaction.interceptor.TransactionInterceptor"><propertyname="transactionManager"><refbean="jtaTransactionManager"/></property><propertyname="transactionAttributes"><props><propkey="add*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="create*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="update*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="config*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="delete*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="save*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="do*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="register*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="remove*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="start*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="pause*">PROPAGATION_REQUIRED,-DataAccessException,-HibernateException,-PersistenceException</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><propkey="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean></property><propertyname="patterns"><list><value>.*BO..*</value></list></property></bean>
这个是全部的配置,DAO层即使抛异常也返回一个数值,我一直怀疑是不是要向上抛异常才能接收到,如果这个是DAO层的事物,我感觉这个就没有意义了。(这些配置文件不是我个人写的,)
解决方案四:
看来不是dao的事务,以BO为结尾的类中所有方法都在事务控制范围内,DAO的异常没有抛到BO层,应该就不会触发事务回滚,建议还是抛出去。BO层没异常,不会回滚。
解决方案五:
异常你没有抓住是吧。。
解决方案六:
引用3楼redcenter的回复:
看来不是dao的事务,以BO为结尾的类中所有方法都在事务控制范围内,DAO的异常没有抛到BO层,应该就不会触发事务回滚,建议还是抛出去。BO层没异常,不会回滚。
我的想法是这样,但是这些还不能随便改
解决方案七:
引用4楼rui888的回复:
异常你没有抓住是吧。。
DAO层有catch到,但是就打印了一下然后反回了一个值,
解决方案八:
引用5楼ningwang0206的回复:
Quote: 引用3楼redcenter的回复:
看来不是dao的事务,以BO为结尾的类中所有方法都在事务控制范围内,DAO的异常没有抛到BO层,应该就不会触发事务回滚,建议还是抛出去。BO层没异常,不会回滚。我的想法是这样,但是这些还不能随便改
额,那这个问题只能反映给有修改权限的同事了
解决方案九:
楼主,该问题解决了吗