spring 事物配置

	private UserDAO userDAO;
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	/**
	 * 异常只有抛出事物才有回滚机制
	 */
	public void saveUser(User user) throws Exception{
		userDAO.save(user);
	}
 
	public void save(User transientInstance) throws Exception {
		log.debug("saving User instance");
		try {
			getHibernateTemplate().save(transientInstance);
			int i = 5/0;
			log.debug("save successful");
		} catch (Exception re) {
			re.printStackTrace();
			log.error("save failed", re);
			throw new Exception();
		}
	}
 
<?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:p="http://www.springframework.org/schema/p"
 	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.xsd
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">
		<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
		<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=plusoft_test"></property>
		<property name="username" value="sa"></property>
		<property name="password" value="admin"></property>
		<property name="defaultAutoCommit" value="false"/>
		<property name="maxActive" value="150" />  
        <property name="maxIdle" value="100" />  
        <property name="maxWait" value="60000" />  
        <property name="minIdle"  value="5" />  
        <property name="testOnBorrow" value="true"/>  
        <property name="testWhileIdle" value="true"/>   
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.SQLServerDialect
				</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>com/ssh2/bean/User.hbm.xml</value>
			</list>
		</property>
	</bean>
	
	<bean id="hibernateDaoTemplate" abstract="true">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    
    <!-- Dao 定义  -->
	<bean id="userDAO" class="com.ssh2.dao.UserDAO" parent="hibernateDaoTemplate" ></bean> 
	
	<!-- Service 定义 -->
	<bean id="userService" class="com.ssh2.service.impl.UserServiceImpl"  autowire="byName">   
       <property name="userDAO" ref="userDAO"></property>   
    </bean> 
   
   <bean id="userAction" class="com.ssh2.action.UserAction">   
       <property name="userService" ref="userService"></property>   
   </bean>   
   
    <!-- Hibernate Transaction Interceptor Definition -->
    <bean id="hibernateTransactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor"
        parent="transactionIntercetorTemplate">
        <property name="transactionManager">
            <bean id="hibernateTransactionManager"
                class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory">
                    <ref bean="sessionFactory" />
                </property>
            </bean>
        </property>
    </bean>

    <!-- transction Intercetor's Template -->
    <bean id="transactionIntercetorTemplate" abstract="true">
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <!-- 事物回滚 -->
                <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
                <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    <!-- 定义自动代理生成器-->
    <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="interceptorNames">
            <list>
                <idref bean="hibernateTransactionInterceptor" />
            </list>
        </property>
        <property name="beanNames">
            <value>*Service</value> 
        </property>
    </bean>
</beans>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring事务失效的情况有以下几种: 1. 代码中未正确使用@Transactional注解或使用错误的Propagation等级导致事务不会被启动或继承; 2. 在方法内部捕获了异常,但没有将其抛出,导致事务无法回滚; 3. 在同一方法内部调用了另一个带有@Transactional注解的方法,但是该注解被忽略了; 4. 在同一类中的两个带有@Transactional注解的方法互相调用,但是没有使用代理对象调用另一个方法,导致事务被忽略; 5. Spring和JPA实现之间的一些特殊情况,例如在同一事务中使用多个数据库连接或跨线程使用EntityManager等。 以上是常见的Spring事务失效的情况,需要注意并避免。 ### 回答2: Spring事务失效的情况有以下几种: 1. 没有配置事务管理器:在Spring中,需要通过配置事务管理器来启用事务处理。如果没有正确配置事务管理器或未进行任何事务配置,那么事务将无法生效。 2. 方法没有被注解为事务:在使用注解来管理事务时,需要在需要添加事务的方法上添加相应的事务注解,比如@Transactional。如果忘记在方法上添加注解或添加错误的注解,事务将无法生效。 3. 异常没有正确处理:事务的生效与异常的处理密切相关。如果在事务方法中发生了未被捕获的异常,并且该异常未被正确处理,事务就会失效。通常,当遇到异常时,应该正确地处理异常,包括回滚事务或进行其他适当的操作。 4. 事务的传播属性设置不正确:在Spring中,可以通过设置事务的传播属性来控制事务的行为。如果在事务方法中设置的传播属性不正确或与预期不符合,事务可能会失效。例如,如果设置了Propagation.REQUIRES_NEW,但实际上需要使用Propagation.REQUIRED,则事务将不会生效。 5. 数据库连接未关闭或未释放:在使用Spring事务时,需要确保数据库连接在事务完成后被正确地关闭或释放。如果没有正确地关闭或释放数据库连接,可能会导致事务失效或遇到其他问题。 总之,要保证Spring事务正常生效,需正确配置事务管理器、使用正确的事务注解、处理异常、设置正确的事务传播属性,并确保数据库连接的正确关闭或释放。 ### 回答3: Spring事务失效可能出现以下情况: 1. 没有正确配置事务管理器:Spring框架依赖于事务管理器来处理事务操作,如果没有正确配置事务管理器,事务将无法起作用。 2. 在没有注解或XML配置的情况下,手动提交或回滚事务:在Spring中,事务可以通过注解或XML配置来自动管理。如果没有进行正确的配置,手动提交或回滚事务可能会导致事务失效。 3. 事务传播属性设置错误:事务传播属性用于确定事务在不同方法调用间如何传播。如果事务传播属性设置错误,可能导致事务失效或不起作用。 4. 异常未正确处理:在事务方法中,如果异常未正确处理或捕获,事务可能会失效。应该使用try-catch块来捕获异常,并在catch块中进行回滚或处理。 5. 方法未被代理:Spring事务通常由动态代理来实现。如果方法没有被代理,事务将无法生效。确保类被正确配置Spring Bean,并从Spring容器中获取实例来处理事务。 6. 事务超过预定的时间或资源限制:如果事务操作超过了数据库或系统设置的时间或资源限制,可能会导致事务失效。应该根据业务需求和系统资源合理设置事务的超时时间和资源限制。 总之,在使用Spring事务时,需要确保正确配置事务管理器、正确设置事务传播属性、正确处理异常、方法被正确代理,并根据实际需求合理设置事务的超时时间和资源限制,以避免事务失效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值