- 首先添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
- 添加依赖后,不需要在springboot启动类上添加 @EnableTransactionManagement开启事务
@Transactional
需要在需要的方法和类上添加注解@Transactional上就可以 注意:当添加在类上,说明此类的public的方法都行事务管理
注意:
一、在业务层捕捉异常后,发现事务不生效。
这是许多新手都会犯的一个错误,在业务层手工捕捉并处理了异常,你都把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。
@Service("userService")
@Transactional //事务的注解
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
public List<User> getAllUser() throws Exception {
try {
List<User> list = userMapper.getAllUser();
return list;
} catch (Exception e) {
//强制手动事务回滚
**TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();**
}
return null;
}
}
二、遇到对非运行异常时,事务不开启,也无法回滚
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
@Transactional //事务的注解
public void update(User user) throws Exception {
userMapper.update(user);
throw new myException("自定义异常");
}
}
查看数据库,可以看到执行完userMapper.update(user); 事务没有回滚
为什么呢:
Spring的默认的事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,很显然自定义的myException继承了Exception。如果想针对非运行异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。
例如下面这样,就可以正常回滚
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
@Transactional(rollbackFor = Exception.class) //事务的注解
public void getAllUser() throws Exception {
List<User> list = userMapper.getAllUser();
throw new myException("自定义异常");
}
}
推荐:若非实际业务要求,则在业务层统一抛出异常,然后在控制层统一处理
@Transactional
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
public void getAllUser() throws Exception {
List<User> list = userMapper.getAllUser();
//推荐:在业务层将异常抛出
throw new RuntimeException("发生异常了..");
}
}
参考链接:
https://www.jianshu.com/p/380a9d980ca5
https://www.jianshu.com/p/380a9d980ca5