关于spring3.2.2配置事务问题

问题描述

我的applicationContext.xml配置如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd"><bean name="S3Impl" class="cn.xiaoxing.s3.dao.impl.S3Impl"><property name="sessionFactory" ref="dbConfig"></property></bean><bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property><property name="url"><value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</value></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="get*" read-only="true" /><tx:method name="*" /></tx:attributes></tx:advice><aop:config><aop:pointcut id="myPointCut" expression="execution(* cn.xiaoxing.s3.dao.impl.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="myPointCut"/></aop:config><!-- 在Spring的application context中创建 SessionFactory --><bean id="dbConfig" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><!-- 资源注册 --><property name="mappingResources"><list><value>cn/xiaoxing/s3/vo/UserModel.hbm.xml</value></list></property><!-- 可选配置 --><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.current_session_context_class">thread</prop></props></property></bean></beans> DAO实现部分代码如下:@Overridepublic boolean create(UserModel um) {Session session = sessionFactory.getCurrentSession();session.save(um);/*Transaction ts = session.beginTransaction();try{session.save(um);ts.commit();}catch(Exception err){ts.rollback();err.printStackTrace();return false;}*/return true;} 报错信息如下:Exception in thread "main" org.hibernate.HibernateException: save is not valid without active transactionat org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:348)at $Proxy5.save(Unknown Source)at cn.xiaoxing.s3.dao.impl.S3Impl.create(S3Impl.java:22)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)at $Proxy4.create(Unknown Source)at cn.xiaoxing.s3.Client.main(Client.java:20) 我的问题是,如果按照上面代码执行的时候会报上面的错误,但如果我在DAO实现类中写hibernate事务后,就可以正常插入数据了,我想显然是因为配置的事务没有生效的缘故,自己折腾了半天也没有搞好,所以请各位帮忙指点。我用的版本:spring3.2.2   hibernate4

解决方案

DataSourceTransactionManager 缓存HibernateTransactionManager
解决方案二:
对单个数据源,使用HibernateTransactionManager正确,DataSourceTransactionManager错误;1.以上配置成功的应用了事务拦截器,当create被调用时成功的开启了事务2.激活事务方式:前者代理到org.hibernate.JDBCTransaction.begin方法,使用缓存标识事务是否激活;后者缓存标识到DataSourceTransactionManager中;3.getCurrentSession时,原生的org.hibernate.Session使用JDK动态代理,对session自身操作方法要求:在操作之前,是否激活事务,而这个判断的关键依赖于JDBCTransaction4.使用DataSourceTransactionManager的缓存标识此时用不到,而使用HibernateTransactionManager正好利用JDBCTransaction缓存标识
解决方案三:
<aop:config> <aop:pointcut id="myPointCut" expression="execution(* cn.xiaoxing.s3.dao.impl.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointCut"/> </aop:config> 切面好像不对吧

时间: 2024-10-09 12:13:01

关于spring3.2.2配置事务问题的相关文章

spring事务-spring AOP 拦截器方式配置事务失效

问题描述 spring AOP 拦截器方式配置事务失效 Spring.xml配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:conte

spring-Spring配置事务后不回滚,麻烦各位大侠帮小弟看看

问题描述 Spring配置事务后不回滚,麻烦各位大侠帮小弟看看 ****Spring 配置文件:**** <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <!-- 注册驱动配置 --> <property name="driver

ssh事务-SSH配置事务tomcat启动报错问题

问题描述 SSH配置事务tomcat启动报错问题 tomcat启动报错: 严重: Exception sending context initialized event to listener instance of class org.apache.struts.plugin.PluginContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with

spring学习笔记(24)基于注解配置事务

使用注解的方式配置事务极为便利,在xml文件上只需声明我们的注解,然后即可直接在相应service类通过标注注解来完成事务配置.相对于配置在xml文件,简洁了需要,但配置信息分散,会导致易读性大大减弱. 使用步骤: 1. 在spring容器中注册注解搜索器 目的是使分散在各业务类中的注解得以生效 <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager"

spring中配置事务管理的问题

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

在Spring3中,配置DataSource的方法有6种。

原文 在Spring3中,配置DataSource的方法有6种. 在Spring3中,配置DataSource的方法有五种. 第一种:beans.xml  Xml代码    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       destroy-method="close">       <property name="dr

spring 事务-not allowed in read-only mode没配置事务,为何报事务方面的错

问题描述 not allowed in read-only mode没配置事务,为何报事务方面的错 org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' mar

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

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

IBM BPM Advanced Integration Service配置事务支持

该实现演示了一些自动回滚功能,这些功能由 AIS 中基于 SCA 的管理与 WS-AT 协议协同提供.在第 2 部分中,您将为示例场景中的 Credit 和 Charge 操作配置事务支持,并实现两个事务 Web 服务(一个使用 .NET® 实现,另一个使用 JEE 实现). 本系列的第 2 部分将会介绍为示例场景中的 Credit 和 Charge 操作配置事务支持并实现两个事务 Web 服务的步骤:一个 .NET Web 服务,用于从机器 A 上的 SQL Server 上的 Bank1 扣