关于spring的事物管理

问题描述

配置文件里如下配置的事物<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层没异常,不会回滚。

我的想法是这样,但是这些还不能随便改

额,那这个问题只能反映给有修改权限的同事了
解决方案九:
楼主,该问题解决了吗

时间: 2024-11-09 00:18:36

关于spring的事物管理的相关文章

MyBatis5中Spring集成MyBatis事物管理_java

单独使用MyBatis对事物进行管理 前面MyBatis的文章有写过相关内容,这里继续写一个最简单的Demo,算是复习一下之前MyBatis的内容吧,先是建表,建立一个简单的Student表: create table student ( student_id int auto_increment, student_name varchar(20) not null, primary key(student_id) ) 建立实体类Student.java: public class Studen

spring 事物管理问题请教,多谢~

问题描述 spring 事物管理问题请教,多谢~注册同时插入两张表,member(mid,mail),company(cid,companyname)代码帖出来,多谢指点~~config.xml<bean id="companyService" class="com.cms.service.impl.CompanyServiceImpl"><property name="companyDAO"><ref local=

spring+hibernate hibernateDaoSupport 的事物管理

问题描述 hibernateDaoSupport 的事物管理hibernateDaoSupport 类来自动创建和提交的吗~!为什么我在用hibernateDaoSupport 对数据库进行增删改没有注入事物,也可以年持久化数据. 解决方案 hibernateDaoSupport 默认是可以不用管理事务和关闭session的. 它可以自动处理. 如果对数据库的操作失败也会回滚到原来的状态. 但我们也可以手动出来事务.. 但session还是不需要我们去关闭的. 如果关闭的session的话会抛s

spring的事务管理配置

一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理. 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚. 因此,在dao层调用事务理论上说不是一个很明智的选择.应该有业务逻辑层service层负责事务,统一处理. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三

Spring的事务管理对何种异常进行回滚

  一.结论 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚. 关于异常的分类请参看本博客的<Java异常分类>http://blog.csdn.net/woshixuye/article/details/8230407     二.改变默认方式 在@Transaction注解中定义noRollbackFor和RollbackFo

ssh声明式事物管理-SSH声明式事物管理不起作用为什么

问题描述 SSH声明式事物管理不起作用为什么 在线求教 各位前辈帮我看一下我的声明式事物管理那里出错了,为什么不起作用 com/transaction/pojo/Role.hbm.xml </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.

spring的事务管理 批量回滚

问题描述 spring的事务管理 批量回滚 如果我有5条SQL语句 然后 第一第二条都没问题 第三条出问题了 需要全部回滚,请问下 Srping本身的那个事务管理器能达到吗 用注解拦截器的方法实现 解决方案 Spring的事务管理与回滚Spring事务管理-回滚spring事务管理 junit回滚 解决方案二: 放在同一个事务里面,异常就会都回滚

CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

  JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction management),为不同的事务实现提供了一致的编程模型,这节以JDBC事务为例,介绍Spring的事务管理.  5.3.1  Spring对事务的支持 事务是一组原子(Atomic)操作的工作单元,以数据库存取的实例来说,就是一组SQL指令,这一组SQL指令必须全部执行成功,若因为某个原因未全

spring 事物-spring+mybatis事物配置的问题

问题描述 spring+mybatis事物配置的问题 昨天遇到一个有关事物方面的问题,请大家帮忙看看,问题出在了什么地方,谢谢! 具体问题描述:根据B表同步A表的数据,结果service方法返回后B表的数据已处理标志没有更新,程序在第二次同步数据时B表的数据才能更新.具体情况见下面代码的注释. 事物配置文件: tx:attributes rollback-for="java.lang.Exception" /> propagation="REQUIRED" r