转自:https://blog.csdn.net/z69183787/article/details/17161393
transactionAttributes 属性:
PROPAGATION
事务传播行为类型 |
说明 |
PROPAGATION_REQUIRED |
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS |
支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY |
使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW |
新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED |
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER |
以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED |
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
Exception:(注解用 rollback-for) 定义当遇到Exception异常 时 回滚。
- <prop=></prop>
- 表示抛出该异常时需要回滚
+表示即使抛出该异常事务同样要提交
-ApplicationException :表示抛出ApplicationException 时,事务需要回滚。但不是说只抛出ApplicationException 异常时,事务才回滚,如果程序抛出RuntimeException和Error时,事务一样会回滚,即使这里没有配置。因为Spring中默认对所有的RuntimeException和Error都会回滚事务。
readonly :
readonly是设置操作权限为只读,一般用于查询的方法,优化作用.
注解形式:
1 <context:annotation-config /> 2 <context:component-scan base-package="com.bluesky" /> 3 4 <tx:annotation-driven transaction-manager="transactionManager"/> 5 6 <bean id="sessionFactory" 7 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 8 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 9 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 10 </bean> 11 12 <!-- 定义事务管理器(声明式的事务) --> 13 <bean id="transactionManager" 14 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 15 <property name="sessionFactory" ref="sessionFactory" /> 16 </bean> 17 18 </beans>
1 package com.bluesky.spring.dao; 2 3 import java.util.List; 4 5 import org.hibernate.SessionFactory; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 8 import org.springframework.stereotype.Component; 9 10 import com.bluesky.spring.domain.User; 11 12 @Transactional(value = "txManager",propagation=Propagation.REQUIRED,rollbackFor=Exception.class,readOnly=true) 13 @Component("userDao") 14 public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 15 16 public List<User> listUsers() { 17 return this.getSession().createQuery("from User").list(); 18 } 19 20 21 }
aop形式:
1 <context:annotation-config /> 2 <context:component-scan base-package="com.bluesky" /> 3 4 <bean id="sessionFactory" 5 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 6 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 7 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 8 </bean> 9 10 <!-- 定义事务管理器(声明式的事务) --> 11 <bean id="transactionManager" 12 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 13 <property name="sessionFactory" ref="sessionFactory" /> 14 </bean> 15 16 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 17 <tx:attributes> 18 <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" /> 19 </tx:attributes> 20 </tx:advice> 21 22 <aop:config> 23 <aop:pointcut id="interceptorPointCuts" 24 expression="execution(* com.wonders.asset.service..*.*(..))" /> 25 <aop:advisor advice-ref="txAdvice" 26 pointcut-ref="interceptorPointCuts" /> 27 </aop:config> 28 </beans>
共享基类:
1 <bean id="sessionFactory" 2 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 3 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 4 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 5 </bean> 6 7 <!-- 定义事务管理器(声明式的事务) --> 8 <bean id="transactionManager" 9 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 10 <property name="sessionFactory" ref="sessionFactory" /> 11 </bean> 12 13 <bean id="transactionBase" 14 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 15 lazy-init="true" abstract="true"> 16 <!-- 配置事务管理器 --> 17 <property name="transactionManager" ref="transactionManager" /> 18 <!-- 配置事务属性 --> 19 <property name="transactionAttributes"> 20 <props> 21 <prop key="*">PROPAGATION_REQUIRED</prop> 22 </props> 23 </property> 24 </bean> 25 26 <!-- 配置DAO --> 27 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 28 <property name="sessionFactory" ref="sessionFactory" /> 29 </bean> 30 31 <bean id="userDao" parent="transactionBase" > 32 <property name="target" ref="userDaoTarget" /> 33 </bean> 34 </beans>