【快学springboot】9.使用 @Transactional 注解配置事务管理

介绍

springboot对数据库事务的使用很是的方便,只须要在方法上添加@Transactional注解便可。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是经过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 所以在实际使用中声明式事务用的比较多。java

使用Transactional注解

Transactional注解使用起来是很是简单的,只须要在相应的方法上面标识Transactional注解便可。spring

下面经过一个简单的例子演示Transaction注解的使用数据库

@Transactional
@Override
public void addUser() {
 User user1 = new User();
 user1.setUsername("happyjava1");
 user1.setPassword("123456");
 userRepo.save(user1);
 int i = 1 / 0;
 User user2 = new User();
 user2.setUsername("happyjava2");
 user2.setPassword("123456");
 userRepo.save(user2);
}
复制代码

这里保存两个用户,而后经过 1/0 的方式使程序出现异常。经过一个测试方法测试:编程

@Test
public void testTx() {
 userService.addUser();
}
复制代码

若是数据库没有user1这条记录,说明事物是起做用了的。springboot

【快学springboot】使用 @Transactional 注解配置事务管理

执行结果是预期的报错了。bash

【快学springboot】使用 @Transactional 注解配置事务管理

数据库也没有jappyjava1这个字段。说明Transactional注解起做用了。app

Transactional注解经过noRollbackFor配置不回滚的异常

Transactional注解能够配置发生某个异常时不进行回滚。好比我在Transaction注解上添加以下属性,指定ArithmeticException不进行事务的回滚。ide

@Transactional(noRollbackFor = ArithmeticException.class)
复制代码

再次运行测试方法。测试

【快学springboot】使用 @Transactional 注解配置事务管理

依然报错了,可是查看数据库,user1这条记录已经插入数据库了。编码

【快学springboot】使用 @Transactional 注解配置事务管理

经过propagation属性配置事务的传播行为

事务的传播行为,默认值为 Propagation.REQUIRED。能够手动指定其余的事务传播行为,以下:

  • Propagation.REQUIRED

若是当前存在事务,则加入该事务,若是当前不存在事务,则建立一个新的事务。

  • Propagation.SUPPORTS

若是当前存在事务,则加入该事务;若是当前不存在事务,则以非事务的方式继续运行。

  • Propagation.MANDATORY

若是当前存在事务,则加入该事务;若是当前不存在事务,则抛出异常。

  • Propagation.REQUIRES_NEW

从新建立一个新的事务,若是当前存在事务,暂停当前的事务。

  • Propagation.NOT_SUPPORTED

以非事务的方式运行,若是当前存在事务,暂停当前的事务。

  • Propagation.NEVER

以非事务的方式运行,若是当前存在事务,则抛出异常。

  • Propagation.NESTED

若是没有,就新建一个事务;若是有,就在当前事务中嵌套其余事务。

经过isolation 属性配置事务的隔离级别

事务的隔离级别,默认值为 Isolation.DEFAULT,这个跟数据库的隔离级别有关系。能够自定义隔离级别,以下:

  • Isolation.DEFAULT
  • Isolation.READ_UNCOMMITTED
  • Isolation.READ_COMMITTED
  • Isolation.REPEATABLE_READ
  • Isolation.SERIALIZABLE

事务的传播行为和隔离级别是比较抽象的东西,本文做为springboot的教程课程暂且不作探讨,等后续有时间会再写文章作探讨。

timeout 属性

事务的超时时间,默认值为-1。若是设置了该时间,超过该时间限制但事务尚未完成,则自动回滚事务。

总结

本文只是介绍了springboot能够经过Transactional注解,快速的配置事务管理。数据库事务,是一个很复杂的东西,若是要讲清楚,就不该该放在一篇springboot相关的文章中进行讲解,后续会再起篇幅,单独讲讲事务相关的东西。

相关文章
相关标签/搜索