- 在对数据库进行一系列操作时,为了进行统一的提交或者回滚操作,需要进行事务管理,在使用事务时,需要有一个事务管理器,可以使用xml方式指定事务管理器,也可以使用Spring Boot中的@Configuration和@Bean注解指定:
- xml方式
<!--配置事务管理器,指定管理着某个数据源,保证数据的完整性和一致性,-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 启动事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
- 注解方式
@Configuration
public class MyAppConfig {
//注入数据源
@Bean//id默认是用方法名作为id
//注入配置文件中的属性 关于数据库的相关配置
@ConfigurationProperties("spring.datasource.xxx")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
//注入事务管理器
//@Qualifier 指定需要装配的组件的id,而不是使用属性名
@Bean
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
事务失效原因
- 方法的修饰符为public;
- 数据库引擎InnoDB支持事务、MyISAM不支持事务;
- 在具体的类或者方法上使用事务注解@Transactional;
- 抛出RuntimeException异常,事务回滚;抛出Exception,事务不回滚;可以使用;
- 使用try…catch…语句块对异常进行捕获并且未抛出RuntimeException异常;
- A方法内部调用B方法,B方法上添加了事务注解,事务不生效,Spring的事务基于AOP实现。