您的位置:首页 > 编程语言 > Java开发

Spring—事务管理

2015-09-23 10:42 573 查看

Spring事务管理分成了两类:编程式事务管理和声明式事务管理

一、编程式的事务管理

手动编写代码进行事务管理 (很少使用)

配置:
<!-- 配置业务类 -->
<bean id="xxxService" class="com.genius.service.impl.xxxService">
<property name="xxxDao" ref="xxxDao"></property>
<!-- 注入事务管理模板 -->
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
<!-- 配置事务管理模版:spring简化事务管理代码提供的类 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>


调用:
public class XxxService {

private XxxDao xxxDao;
private TransactionTemplate transactionTemplate;
public void transfer(){
transactionTemplate.execute(new TransactionCallbackWithoutResult() {

@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
// TODO 事务业务处理操作
}
})
}
}


二、声明式的事务管理

基于TransactionProxyFactoryBean的方式(很少使用)

注:需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强

配置:
<bean id="xxxService" class="com.genius.service.impl.xxxService">
<property name="xxxDao" ref="xxxDao"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置业务层的代理 -->
<bean id="xxxServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 注入事务管理器 -->
<property name="transactionManager" ref="transactionManager"></property>
<!-- 配置目标Service -->
<property name="target" ref="xxxService"></property>
<!-- 注入事务属性 -->
<property name="transactionAttributes">
<props>
<!--
prop的格式:
* PROPAGATION :事务的传播行为
* ISOLATION   :事务的隔离级别
* readOnly    :只读(不可以进行修改,插入,删除)
* -Exception  :发生哪些异常回滚事务
* +Exception  :发生哪些异常不回滚事务
-->
<prop key="insert*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>


调用:
要注入代理类xxxServiceProxy而不能注入原有的类xxxService,否则事务不起作用


基于AspectJ的XML方式(经常使用)

注:一旦配置好之后,类上不需要添加任何东西(非常清楚的可以看出哪些类使用了事务)

配置:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务的通知(事务增强) -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- AOP 配置 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="transactionPointcut" expression="execution(* com.sinosoft.rpf.service..*Impl.*(..))" />
<!-- 配置切面 -->
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
</aop:config>


调用:直接写业务类,不需要任何其它操作


基于注解的方式(经常使用)

注:配置很简单,使用方便,只需在业务层类上添加一个@Transaction的注解

配置:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启注解事务,如果不指定transaction-manager默认会查找名为transactionManager的bean -->
<tx:annotation-driven transaction-manager="transactionManager" />


调用:
业务类上添加@Transaction的注解即可完成事务管理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  事务管理 spring