Spring管理事物两种方式
1. 编程式事物管理(在开发中不经常使用)
使用步骤
1. 配置数据库事物管理 DataSourceTransactionManager
<!--配置事物管理器-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2. 配置数据库事物管理模板
<!--配置事物管理模板-->
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<!--配置事物管理-->
<property name="transactionManager" ref="transactionManager"></property>
</bean>
3. 在Service层中注入数据库事物管理模板
<!--配置Service-->
<bean id="accountService" class="top.wintp.springtx.demo1.service.AccountServiceImpl">
<!--配置事物的管理模板类-->
<property name="transactionTemplate" ref="transactionTemplate"/>
<property name="accountDao" ref="accountDao"/>
</bean>
4. 在需要执行事物的位置调用transactionTemplate的execute()方法
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
//执行你的逻辑
}
});
2. 声明式事物管理
声明式事务管理方式一:基于TransactionProxyFactoryBean的方式 (不常用)
使用步骤
1.配置事物管理 DataResourceTransactionManager
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.配置事物代理类
<!--配置事务代理类-->
<bean id="accountServiceProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--配置事务管理器-->
<property name="transactionManager" ref="transactionManager"/>
<!--配置代理目标类-->
<property name="target" ref="accountService"></property>
<!--
配置事物的基本属性
必须配置
-->
<property name="transactionAttributes">
<props>
<!--
prop 格式
key:方法名 或者 方法 * 例如 insert*
值的格式:
PROPAGATION:事物的传播行为
ISOLATION:事物的隔离级别
readOnly:只读
-Exception:发生哪些异常,回滚事物 默认任何异常都回滚
+Exception:发生哪些异常,不回滚事物
-->
<prop key="transfMoney">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
3.引用代理类 使用代理目标类来接收
@Resource(name = "accountServiceProxy")
private AccountService mAccountService;
声明式事务管理方式二:基于AspectJ的XML方式
1.配置事物管理类
<!--配置事物的管理类-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.配置事物的增强
<!--配置事物的增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
###### 3.配置AOP – 切点和切面
<!--配置AOP-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pointcut1"
expression="execution(* top.wintp.springtx.demo6.service.AccountService+.*(..))"/>
<!--配置切面-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
声明式事务管理方式三:基于注解的方式
1.配置事物管理器
<!--配置事物的管理类-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.开启事物注解
<!--开启事物注解
-->
<tx:annotation-driven transaction-manager="transactionManager"/>
3.在需要事物管理的类上添加注解
@Transactional(propagation = Propagation.REQUIRED)