Spring事务管理分为编程式事务和声明式事务,但是编程式事务过于复杂并且具有高度耦合性,违背了Spring框架的设计初衷,因此这里只用声明式事务,声明式事务是基于AOP实现的
只需要在配置类添加`@EnableTransactionManagement`注解即可开启Spring的事务支持。接着,需要把一个事务要做的所有事情封装到Service层的一个方法中即可,并在配置文件中注册一个新的Bean,事务需要执行必须有一个事务管理器
@Bean
public TransactionManager transactionManager(@Autowired DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
编写Mapper操作和业务层的接口,再来编写业务层的实现,我们可以直接将其注册为Bean,交给Spring来进行管理,这样就可以自动将Mapper注入到类中了,并且可以支持事务,只需在方法上添加`@Transactional`注解,即可表示此方法执行的是一个事务操作,在调用此方法时,Spring会通过AOP机制为其进行增强,一旦发现异常,事务会自动回滚。
@Component
public class TestServiceImpl implements TestService{
@Resource
TestMapper mapper;
@Transactional
@Override
public void test() {
mapper.insertStudent();
mapper.insertStudent();
}
}
@Transactional`注解的参数
* transactionManager:指定事务管理器
* propagation:事务传播规则,一个事务可以包括N个子事务
* isolation:事务隔离级别
* timeout:事务超时时间
* readOnly:是否为只读事务,不同的数据库会根据只读属性进行优化,比如MySQL一旦声明事务为只读,那么久不允许增删改操作了。
* rollbackFor和noRollbackFor:发生指定异常时回滚或是不回滚,默认发生任何异常都回滚
事务传播一共有七种级别,Spring默认的传播级别是`PROPAGATION_REQUIRED`
集成JUnit测试
Spring为我们提供了一个Test模块,它会自动集成Junit进行测试
依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.12</version>
</dependency>
然后直接在测试类上添加两个注解就可以搞定
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class TestMain {
@Autowired
TestService service;
@Test
public void test(){
service.test();
}
}
`@ExtendWith`是由JUnit提供的注解,等同于旧版本的`@RunWith`注解,然后使用SpringTest模块提供的`@ContextConfiguration`注解来表示要加载哪一个配置文件,可以是XML文件也可以是类,配置完成后,我们可以直接使用`@Autowired`来进行依赖注入,并且直接在测试方法中使用注入的Bean