9 Spring学习:Spring事务管理( 五 )

第八步 , 按照前面所述3种方式开始测试 , 注意每次测试均从此处开始 。
基于TransactionProxyFactoryBean的方式首先在applicationContext.xml文件中添加事务管理器相关配置和TransactionProxyFactoryBean代理对象(前七步的代码这里不再重复贴出 , 这里这贴出与本方式相关的代码):
<!--基于TransactionProxyFactoryBean的方式--><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置业务层的代理--><bean id="transferServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><!--配置目标对象--><property name="target" ref="transferService" /><!--注入事务管理器--><property name="transactionManager" ref="transactionManager" /><!--注入事务属性--><property name="transactionAttributes"><props><!--prop的格式:* PROPAGATION :事务的传播行为* ISOLATION :事务的隔离级别* readOnly :是否只读* -Exception :发生哪些异常回滚事务* +Exception :发生哪些异常不回滚事务--><prop key="transfer*">PROPAGATION_REQUIRED</prop></props></property></bean>接着新建一个测试类SpringTransactionApplicationTest:
import com.envy.service.TransferService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringTransactionApplicationTest {@Autowiredprivate TransferService transferService;@Resource(name="transferServiceProxy")private TransferService transferServiceProxy;@Testpublic void TestOne(){//注意 , 此处使用的是代理对象transferServiceProxy , 而不是transferServicetransferServiceProxy.transferMoney("小明","小白",66L);}}运行结果为:
java.lang.ArithmeticException: / by zero可以看到执行service事务方法时抛出异常 , 事务回滚 , 数据库中数据未发生改变:(如果将transferMoney方法中的int i = 100/0;代码注释掉 , 则转账会成功 。)

9 Spring学习:Spring事务管理

文章插图
 
基于AspectJ的XML方式首先在applicationContext.xml文件中添加事务管理器的配置、事务的增强以及切面:
<!--基于AspectJ的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><tx:method name="transfer" propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置切面--><aop:config><!--配置切入点--><aop:pointcut id="pointcut1" expression="execution(* com.envy.service.Impl.*ServiceImpl.*(..))"/><!--配置AOP的切面--><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/></aop:config>接着新建一个测试类SpringTransactionApplicationTestTwo:
import com.envy.service.TransferService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringTransactionApplicationTestTwo {@Autowiredprivate TransferService transferService;@Testpublic void TestTwo(){transferService.transferMoney("小明","小白",88L);}}运行结果为:


推荐阅读