本文共 4244 字,大约阅读时间需要 14 分钟。
这篇文章主要介绍Spring中事务处理的方式及其实现。
1、编程式事务处理具体实现
applicationContext.xml文件配置 -
- <bean id="accountService" class="com.zs.spring.demo1.AccountServiceImpl">
- <property name="accountDao" ref="accountDao" />
-
- <property name="transactionTemplate" ref="transactionTemplate" />
- </bean>
-
-
- <bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
-
-
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
-
- <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
- <property name="transactionManager" ref="transactionManager"/>
- </bean>
-
- private TransactionTemplate transactionTemplate;
-
-
-
-
-
-
- @Override
- public void transfer(final String out, final String in, final Double money) {
-
- transactionTemplate.execute(new TransactionCallbackWithoutResult() {
- @Override
- protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
- accountDao.outMoney(out, money);
-
- accountDao.inMoney(in, money);
- }
- });
- }
编程式的事务处理相对来说繁琐,需要对每个使用到事务处理的类中写代码,这种方式一般使用的情况很少,大家了解下即可。
2、声明式事务处理具体实现
a、TransactionProxyFactoryBean方式的具体实现:
applicationContext.xml配置文件:
-
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
-
- <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
-
- <property name="target" ref="accountService" />
-
- <property name="transactionManager" ref="transactionManager"></property>
-
- <property name="transactionAttributes">
- <props>
- <!--
- prop的格式:
- * PROPAGATION :事务的传播行为
- * ISOTATION :事务的隔离级别
- * readOnly :只读
- * -EXCEPTION :发生哪些异常回滚事务
- * +EXCEPTION :发生哪些异常不回滚事务
- -->
- <prop key="transfer">PROPAGATION_REQUIRED</prop>
-
-
- </props>
- </property>
- </bean>
这种方式虽然不在Service层附加任何代码,但是在配置的时候需要把使用到的类都注入到配置文件中,如上代码示例中的目标对象!这种方式也相对来说比较繁
琐,大家了解下即可。
b、基于AspectJ的xml配置方式
applicationContext.xml文件:
-
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
-
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <!--
- propagation :事务传播行为
- isolation :事务的隔离级别
- read-only :只读
- rollback-for:发生哪些异常回滚
- no-rollback-for :发生哪些异常不回滚
- timeout :过期信息
- -->
- <tx:method name="transfer" propagation="REQUIRED"/>
- </tx:attributes>
- </tx:advice>
-
-
- <aop:config>
-
- <aop:pointcut expression="execution(* com.zs.spring.demo3.AccountService+.*(..))" id="pointcut1"/>
-
- <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
- </aop:config>
这种方式利用到了Spring中的Aop,实现了自动拦截,只要Service中有出现了异常,事务都可以回滚,在配置的时候需要着重注意配置事务的隔离级别,不需
要太繁琐,这样会导致效率和性能的低下。
c、使用注解的方式:
applicationContext.xml文件:
-
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
-
- <tx:annotation-driven transaction-manager="transactionManager"/>
在具体使用的时候需要加上@Transactional注解。这种方式配置简单,使用起来方便。
3、小结
Spring中对事务这块提供了很多的实现方式,大家需要在了解Spring事务管理的时候,把事务这块的知识做好功课哦,这样理解起来就更加方便了。
转载地址:http://agzhd.baihongyu.com/