(一)
编程式事务管理(少用,缺点:代码侵入事务层,改编代码结构)
实现方式:
把需要进行事务管理的方法放到指定方法中,例如:
public void transferAccount(double money, int userA, int userB) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
//需要进行事务管理的两个方法
bankDao.outMoney(money, userA);
bankDao.inMoney(money, userB);
}
});
}
(二)
声明式事务管理
实现方式:配置XML文件,再执行方法时,运用AOP切入事务通知
配置如下:
<!-- 这里运用的是jdbc的事务管理器 必须先配置jdbc的数据源-->
1.配置jdbc数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
2.配置jdbc事务管理器
<!-- jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3.配置事务通知
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
4.配置切面(在执行com.czp.service包下的方法前,通知执行事务管理)
<!-- 配置事务的切面 -->
<aop:config>
<aop:pointcut expression="execution(* com.czp.service.*.*(..))" id="serviceMethod"/>
<!-- 配置事务通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
(三)
使用注解配置声明式事务管理
实现方式:在需要事务管理的事务类添加注解
@Transactional
XML必须配置
<tx:annotation-driven transaction-manager="transactionManager"/>