事务概念
###在使用事务之前,我们要理解下事务概念:
什么是事务呢?事务是并发控制的单位,是用户定义的一个操作序列。有四个特性:
- 原子性(Atomicity):
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性(Consistency):
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(Isolation):
一个事务的执行不能被其他事务干扰。- 持续性/永久性(Durability):
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
以上是书面解释,简单来说就是把你的操作统一化,要么所有操作都成功,要么就都不成功,如果执行中有某一项操作失败,其之前所有的操作都回滚到未执行这一系列操作之前的状态。
SpringBoot中事务的配置
- pom中依赖,spring-boot-starter-data-jpa 或是 spring-boot-starter-jdbc等 ,我这里用了spring-boot-starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.3.6.RELEASE</version>
</dependency>
- 在Application主方法上添加@EnableConfigurationProperties注解,用来启用事务的管理
@SpringBootApplication
@RestController
@EnableConfigurationProperties // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
public class AAAtstpApplication {
public static void main(String[] args) {
SpringApplication.run(AAAtstpApplication.class, args);
}
- 也可以在main方法上方加入
@Bean
public Object testBean(PlatformTransactionManager platformTransactionManager){
System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
return new Object();
}
- debug观察下注入的是哪个实例
- 这里可以知道spring-boot-starter-data-jpa依赖默认会注入JpaTransactionManager 实例,我们也可以手工的注解@Bean,手工注解Bean会优先被加载,框架不会重新实例化其他PlatformTransactionManager 实现类,但可以注解多个,用来创建多个不同的事务管理器。
// 创建事务管理器1
@Bean(name = "tMgr1")
public PlatformTransactionManager tMgr1(EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
// 创建事务管理器2
@Bean(name = "tMgr2")
public PlatformTransactionManager tMgr2(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
SpringBoot中事务的使用
只需要在Service上加入@Transactional注解即可,当配置多个Manager时要加上Value,不然会抛异常,注解也可以加在类上,整个类中的方法都会支持事务。
//删除简历
@Transactional
public HttpResponseEntity deleteResume(List<String> resumeIds) throws LgdServiceException{...}
例如上面的方法可能会对三个表进行操作,如果前两个表删除成功,第三个表删除失败,事务会回滚回前两个删除之前的状态。