Springboot service层事务管理、若catch异常并抛出非运行时异常,手动回滚事务案例

1 篇文章 0 订阅
1 篇文章 0 订阅

- 首先添加依赖

		<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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值