Spring Boot开启事务很简单,只需要一个注解@Transactional就可以了,因为在Spring Boot中已经默认对JPA、JDBC、MyBatis开启了事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的ORM框架,比如BeatlSQL,就需要自己配置相关的事务管理器。
Spring Boot用于配置事务的类为TransactionAutoConfiguration,此配置类依赖于JtaAutoConfiguration和DataSourceTransactionManagerAutoConfiguration,具体查看源代码可知,而DataSourceTransactionManagerAutoConfiguration已开启了对声明式事务的支持,所以在Spring Boot中,无须显示开启使用@EnableTransactionManagement。
在第2章中,我们已经在Spring Boot中集成了Spring Data JPA,同时开发了AyUserRepository类实现JpaRepository接口,JpaRepository接口是不开启事务的,而SimpleJpaRepository默认是开启事务的,所以我们需要手工给AyUserRepository添加事务。AyUserRepository类中的方法是在服务层类AyUserServiceImpl中被使用,而事务一般都是加在服务层,因此可以在AyUserServiceImpl类上添加@Transactional注解来开启事务。AyUserServiceImpl类开启事务的代码如下:
@Transactional注解在类上,意味着此类的所有public方法都是开启事务的。
@Transactional除了可以注解在类上,还可以注解到方法上面。当注解在类上的时候意味着此类的所有public方法都是开事务的。如果类级别和方法级别同时使用了@Transactional注解,则使用方法级别注解覆盖类级别注解。可以给AyUserServiceImpl类中的save()方法添加事务,同时在save完成之后抛出NullPointException异常,查看数据是否可以回滚,具体代码如下:
5.2.1节和5.2.2节代码开发完成之后,我们在测试类DemoApplicationTests中添加测试方法,具体代码如下:
运行testTransaction()单元测试用例,当代码执行完成后,由于方法save保持数据时,出现空指针,数据会回滚,数据库查询不到保存的数据。现在我们把AyUserServiceImpl类上的@Transactional注解和save方法上的@Transactional注解全部注释掉,再次执行testTransaction()单元测试用例,查询数据库,发现数据库多了一条数据,如图5-1所示。
图5-1 数据插入到数据库