Spring 事务管理(四种方法)

来源:互联网 发布:蒙古剔肉小刀 淘宝 编辑:程序博客网 时间:2024/06/04 12:23
Spring将事务管理分成了两类:一、编程式事务管理
手动编写代码进行事务管理(很少使用)
二、声明式事务管理
1. 基于TransactionProxyFactoryBean的方式(很少使用)
——需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
2. 基于AspectJ的xml方式(经常使用)
——一旦配置好,类上不需要添加任何东西
3. 基于注解(经常使用)
——配置简单,需要在业务层类上添加一个@Transactionl的注解

无论哪种方法,都需要配置TransactionManager事务管理器类(以JDBC数据源为例):

applicationContext.xml

<!-- C3P0数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}" /></bean><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>

1. 编程式事务管理

applicationContext.xml

...<!-- 使用事务模板简化编程 --><bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="transactionManager" /></bean>

Service.java

/*** 编程式的事务管理*/@Overridepublic void youMethod(..) {transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {...//你的业务逻辑代码}});}

2.基于TransactionProxyFactoryBean的方式

applicationContext.xml

......<!-- 配置业务层的代理 --><bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="target" ref="accountService"/><property name="transactionManager" ref="transactionManager" /><property name="transactionAttributes"><props><!-- prop格式:* PROPAGATION:事务的传播行为* ISOLATION:事务的隔离级别* readOnly:只读(不可以进行修改,插入,删除的操作)* -Exception:发生哪些异常回滚事务* +Exception:发生哪些异常事务不回滚--><prop key="transfer">PROPAGATION_REQUIRED,-java.lang.ArithmeticException</prop></props></property></bean>

业务层无需多余代码(这也是声明式事务的好处,不会打乱代码逻辑)


3. 基于AspectJ的XML方式

applicationContext.xml

...<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(* org.spring.transaction.AccountService+.*(..))" id="pointcut"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/></aop:config>

4.基于注解

applicationContext.xml

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

Service.java

/* * @Transactional 注解中的属性 * propagation:传播行为 * isolation:隔离级别 * read-only:只读 * rollback-for:发生哪些异常时回滚 * no-rollback-for:发生哪些异常时不回滚 * timeout:过期信息 */@Transactional(propagation=Propagation.REQUIRED)public class YourService(){  ...}


0 0
原创粉丝点击