本节演示的例子基于Spring Boot整合MyBatis,MyBatis整合进Spring Boot工程的方法已经在前面章节有详细的讲解,不再赘述。按照之前的方法新建一个工程MysqlExample。
Spring Boot项目事务配置步骤:
1)注解依赖
需要的注解为@EnableTransactionManagement和@Transactional,它们来自spring-tx-4.3.14.RELEASE.jar包,该包在配置MyBatis依赖时,通过起步依赖mybatis-spring-boot-starter已自动引入。
2)业务类添加@Transactional注解
@Transactional注解如果加在类上,则该类所有的方法都会被事务管理,如果加在方法上,则仅对该方法进行事务管理。一般都是加在方法上,因为只有涉及增、删、改才会需要事务。
在工程中,添加业务逻辑处理类ProductServiceImpl,此类中包含addProduct方法,用于添加商品,在此方法上添加事务注解,并指定REQUIRED事务传播行为,事务隔离级别为底层数据库的默认隔离级别,事务超时时间为30s,针对Exception进行回滚:
上面配置@Transactional注解时使用了相关属性,属性含义见表10-2。
表10-2 事务属性
(www.xing528.com)
3)开启事务
其实目前的事务已经是默认开启的,但是为了标记此服务中包含事务处理,可以在工程的启动类中添加注解@EnableTransactionManagement。
通过上面的三步,即完成了事务的配置。那么配置事务与未配置事务有什么区别呢?这里编写了两个测试方法进行验证。即在ProductServiceImpl类中添加两个方法,其执行内容一致,不同的地方在于方法modifyProductsByTransaction()添加了@Transactional注解,而方法modifyProducts()未添加,在方法体里面通过“int i=4/0;”语句来抛出异常。
添加测试类ProductMapperTest,分别执行两个方法。
执行两个测试方法时,均抛出了异常:
java.ang.ArithmeticException:/by zero
但是方法modifyProducts()的第一条数据仍然被持久化到数据库中。而添加了@Transactional的方法modifyProductsByTransaction()执行后,两条记录都没有被持久化到数据库中。可见@Transactional作用可以保证事务的原子性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。