service层事务与try/catch的关系

首先了解一下异常的组成:

1、RuntimeException()  例如:数组越界异常、空指针异常、(我们在编写之后不会提示让 try catch的异常、代码编写错误导致,可避免)

2、非RuntimeException() 例如: IO异常、(会提示try catch的异常,不是代码编写错误导致的,只能抛出)

3、unchecked异常:RuntimeException + Error

4、checked异常:非RuntimeException()

详细文章:http://blog.csdn.net/qq_14982047/article/details/50989761

spring通过异常进行事务回滚的机制:

1、spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚;

2、我们有时为了打印日志,会在service层抓住Exception并打印日志,这时我们的所有异常都会被认为成checked异常。

3、为了事务的正常生效:当有try catch后捕获了异常,事务不会回滚,如果不得不在service层写try catch 需要catch后 throw new RuntimeException 让事务回滚;

例子:

try {    
    } catch (Exception e) {
		e.printStackTrace();
		logger.error("发生异常");
		throw new RuntimeException();
	}

如何保证在有返回值的方法中进行异常的捕获?

方法1:

因为要保证当前方法具有返回值,在前端界面展示操作状态。所以我们service层在添加了try catch日志打印后,抛出的runtime类异常需要在controller层进行捕获,捕获之后,在catch中编写操作失败后返回值的信息。

方法2:

不依赖于spring的异常捕获机制进行事务回滚,通过手动的session.rollback进行异常捕获后回滚事务也可。



  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,你可以使用try-catch语句来处理异常并实现事务的回滚。通常情况下,如果在事务中抛出异常,Spring会自动回滚该事务。但是,如果你想在try-catch块中捕获异常并手动控制事务的回滚,你可以按照以下步骤操作: 1. 确保你的应用程序的事务管理器已经配置好。你可以通过在Spring Boot的配置类上添加`@EnableTransactionManagement`注解来启用事务管理。 2. 在需要进行事务管理的方法上添加`@Transactional`注解。这将告诉Spring该方法需要在事务内执行。 3. 在try-catch块中捕获可能抛出的异常。你可以在catch块中编写逻辑来处理异常,例如记录日志或发送警报。 4. 如果你想手动回滚事务,可以使用`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`方法来标记当前事务为回滚状态。 下面是一个示例代码: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void updateUser(User user) { try { // 业务逻辑 userRepository.save(user); } catch (Exception e) { // 异常处理逻辑 // 记录日志或发送警报 // 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } ``` 在上面的例子中,`updateUser`方法使用了`@Transactional`注解来启用事务管理。如果在`userRepository.save(user)`方法执行过程中抛出异常,catch块中的逻辑将会被执行,并且事务会被手动回滚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值