源码:https://gitee.com/fenglifengli/springtransaction.git
在声明式事务配置中的两种方式配置事务,个人推荐使用基于注解的方式。
一、spring事务中的核心接口
- PlatformTransactionManager:该接口用于管理事务。然而它不知道底层是怎样管理事务的,该接口有很多实现类。
- TransactionDefinition:该接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法。
- TransactionStatus:该接口是事务的状态,它描述了某一时间点上事务的状态信息。
二、事务管理的方式
2.1 基于XML的方式
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="*" propagation="REQUIRED"
isolation="DEFAULT" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config >
<aop:pointcut id="txPoint" expression="execution(* com.fengli.dao.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"></aop:advisor>
</aop:config>
被进行事务管理的类
public void transfer(String outUser, String inUser, Double money) {
this .jdbcTemplate.update("update account set balance = balance +? "
+ "where username = ?",money , inUser);
//模拟系统运行时的突发性问题
int i = 1/0;
//汇款时,汇款用户的余额=现有余额-所汇金额
this.jdbcTemplate.update("update account set balance = balance-? "
+ "where username = ?",money , outUser);
}
运行结果,就是当在执行transfer
方法时,已经在数据库执行的操作会被撤销。如果注释掉xml
中的配置的话,当发生异常时,已经对数据库进行的操作会保留下来。
2.2 基于注解的方式
xml
配置
<!--配置事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
现在只有在你想要进行事务管理的类上面使用注解@Transactional
就行。在该注解上面就可以设置事务的属性了。
如:
@Transactional
public class AccountDaoImpl implements AccountDao {
…………
}
运行结果和以xml
方式配置事务一样。