spring 事务实现方式都有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 事务实现方式都有哪些?相关的知识,希望对你有一定的参考价值。

第一种方式:每个Bean都有一个代理

    <bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    </bean>

    <!-- 定义事务管理器(声明式的事务) -->

    <bean id="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <!-- 配置DAO -->

    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <bean id="userDao"

    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <!-- 配置事务管理器 -->

    <property name="transactionManager" ref="transactionManager" />

    <property name="target" ref="userDaoTarget" />

    <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />

    <!-- 配置事务属性 -->

    <property name="transactionAttributes">

    <props>

    <prop key="*">PROPAGATION_REQUIRED</prop>

    </props>

    </property>

    </bean>

    </beans>

    第二种方式:所有Bean共享一个代理基类

    <bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    </bean>

    <!-- 定义事务管理器(声明式的事务) -->

    <bean id="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <bean id="transactionBase"

    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

    lazy-init="true" abstract="true">

    <!-- 配置事务管理器 -->

    <property name="transactionManager" ref="transactionManager" />

    <!-- 配置事务属性 -->

    <property name="transactionAttributes">

    <props>

    <prop key="*">PROPAGATION_REQUIRED</prop>

    </props>

    </property>

    </bean>

    <!-- 配置DAO -->

    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <bean id="userDao" parent="transactionBase" >

    <property name="target" ref="userDaoTarget" />

    </bean>

    </beans>

    第三种方式:使用拦截器

    <bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    </bean>

    <!-- 定义事务管理器(声明式的事务) -->

    <bean id="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <bean id="transactionInterceptor"

    class="org.springframework.transaction.interceptor.TransactionInterceptor">

    <property name="transactionManager" ref="transactionManager" />

    <!-- 配置事务属性 -->

    <property name="transactionAttributes">

    <props>

    <prop key="*">PROPAGATION_REQUIRED</prop>

    </props>

    </property>

    </bean>

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

    <property name="beanNames">

    <list>

    <value>*Dao</value>

    </list>

    </property>

    <property name="interceptorNames">

    <list>

    <value>transactionInterceptor</value>

    </list>

    </property>

    </bean>

    <!-- 配置DAO -->

    <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    </beans>

    第四种方式:使用tx标签配置的拦截器

    <bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    </bean>

    <!-- 定义事务管理器(声明式的事务) -->

    <bean id="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

    <tx:attributes>

    <tx:method name="*" propagation="REQUIRED" />

    </tx:attributes>

    </tx:advice>

    <aop:config>

    <aop:pointcut id="interceptorPointCuts"

    expression="execution(* com.bluesky.spring.dao.*.*(..))" />

    <aop:advisor advice-ref="txAdvice"

    pointcut-ref="interceptorPointCuts" />

    </aop:config>

    </beans>

    第五种方式:全注

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    </bean>

    <!-- 定义事务管理器(声明式的事务) -->

    <bean id="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    </bean>

    </beans>

参考技术A 1使用bean在xml文件中配置
2使用注解@Transaction在你想要实现事务的类或者方法上面配置,并且需要在xml开启注解扫描

以上是关于spring 事务实现方式都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

spring中的事物都有哪些

SQL Server启动事务有几种方式?

ibatis的事务处理都有哪些配置方式;

spring的读写事务和只读事务的区别

Spring的事务管理有几种方式?Spring常用的实物隔离级别是哪几种?

关于事务管理的理解和Spring事务管理详解