spring配置事务管理之后有问题

问题描述

配置文件:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--定义数据库连接池数据源bean,该数据源连接的是mysql数据库,并设置数据库的URL、用户名和密码destroy-method="close"的作用是当数据库连接不适用的时候,就该把连接重新放到数据池中,方便下次使用调用。--><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><propertyname="driverClass"value="com.mysql.jdbc.Driver"></property><propertyname="jdbcUrl"value="jdbc:mysql://${jdbc.host}:${jdbc.port}/${jdbc.database}?useUnicode=true&amp;characterEncoding=UTF-8"></property><propertyname="user"value="${jdbc.user}"></property><propertyname="password"value="${jdbc.password}"></property><!--添加c3p0连接池--><!--初始化连接池中的连接数,取值应该在minPoolSize和maxPoolSize之间--><propertyname="initialPoolSize"value="2"/><!--连接池中保留的最小连接数--><propertyname="minPoolSize"value="1"/><!--连接池中保留的最大连接数--><propertyname="maxPoolSize"value="100"/><!--当连接池中的连接耗尽的时候c3p0一次同时获得的连接数--><propertyname="acquireIncrement"value="5"/><!--最大空闲时间,60秒内未使用的连接则被丢弃。若0则永不丢弃。默认值为0<propertyname="maxIdleTime"value="60"/>--><!--c3p0是异步操作的,缓慢的JDBC操作通过帮助线程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作被同时执行--><propertyname="numHelperThreads"value="3"/><!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量,但由于缓存的statement属于单个connection而不属于整个连接数池,所以设置这个参数需要考虑到多方面的因素--><propertyname="maxStatements"value="100"/></bean><!--配置sessionFactory,依赖注入上面的dataSource数据源--><beanid="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><!--注册实体类模型注解--><propertyname="packagesToScan"value="sh.entity"/><propertyname="hibernateProperties"><props><!--针对MySQL数据库的方言,特定的关系数据库生成优化的SQL--><propkey="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop><!--hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。--><propkey="hibernate.hbm2ddl.auto">update</prop><!--是否在控制台打印sql语句--><propkey="hibernate.show_sql">true</prop><!--输出格式化后的sql,更方便查看--><propkey="hiberante.format_sql">true</prop></props></property></bean><!--定义事务管理器(声明式的事务)--><beanid="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><propertyname="sessionFactory"ref="sessionFactory"/></bean><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="add*"propagation="REQUIRED"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice><aop:config><aop:pointcutid="interceptorPointCuts"expression="execution(*sh.service.*.*(..))"/><aop:advisoradvice-ref="txAdvice"pointcut-ref="interceptorPointCuts"/></aop:config></beans>模板类中的方法:@Overridepublicvoidupdate(Serializableid){System.out.println("调用update方法中的id:"+id);Tt=this.get(id);System.out.println(t);//调用get方法返回对应id的对象Tif(t!=null){//如果对象t存在,就更新对象getSession().update(t);//getSession().flush();System.out.println("update之后再输出t:"+t);System.out.println("调用完成update方法");}}@Overridepublicvoiddelete(Serializableid){Tt=this.get(id);if(t!=null){getSession().delete(t);//getSession().flush();}}在测试delete和update方法时,id能够到方法里面,方法也执行了,但是就是没效果,如果在方法后面加上flush()方法就有效果,但是add方法不用加就有效果

解决方案

解决方案二:
看你的配置的意思实在servise层加了事务,注意一下几点1:事务加的层对不?2:事务默认回归runtime异常,你是否在dao层或service层把异常处理掉了,没有抛出事务就不起作用了<tx:methodname="add*"propagation="REQUIRED"/>改成<tx:methodname="add*"propagation="REQUIRED"rollback-for="Exception"/>就会拦截所有异常
解决方案三:
估计是你方法执行了,sql事务没提交,你可以配置一下,打出sql看看,是否执行了update语句

时间: 2024-09-18 10:55:23

spring配置事务管理之后有问题的相关文章

spring的事务管理配置

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

spring中配置事务管理的问题

问题描述 spring中配置事务管理的问题 我的Spring配置文件中加上下面的配置,程序启动就报404,是为什么? <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="REQUIRED" read-only=&q

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

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

详解Spring配置事务的五种方式_java

Spring配置文件中关于事务配置总是由三个组成部分,分别是 DataSource .TransactionManager  和 代理机制 这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager. 具

【spring源码学习】spring的事务管理的源码解析

[一]spring事务管理(1)spring的事务管理,是基于aop动态代理实现的.对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transaction.interceptor.TransactionInterceptor.===>spring事务管理的核心拦截器===>需要配置的数据项:事务管理机制配置属性的查找类transactionAttributeSource,事务管理的核心处理器PlatformTransactionManager

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

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

spring的事务管理 批量回滚

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

SPRING进行事务管理简单问题

问题描述 我用SSH进行开发,使用SPRING代理STRUTS,我想进行HIBERNATE的事务管理,如果我显性进行事务管理,可以成功,但是在SPRING中配置事务就会出现异常,说无法创建bean.就是说我把事务管理的这段代码删除掉就异常了我的SPRING配置如下<!--下边是代理的struts的action--><bean name="/insert" class="com.yourcompany.struts.action.InsertAction&qu

昨天弄到半夜,Spring2.5 Ibatis2.3 注解注入,配置事务管理不成功

问题描述 Spring2.5+Ibatis2.3 用注解方式注入,事务管理不成功.....业务层:@Servicepublic class UserServiceImpl implements UserService {@Resourceprivate UserDao userDao;public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDa