前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC中的事务和异常

SpringMVC中的事务和异常

作者头像
码客说
发布2019-10-21 17:23:43
6090
发布2019-10-21 17:23:43
举报
文章被收录于专栏:码客码客

异常

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

  1. RuntimeException() 例如:数组越界异常、空指针异常、(我们在编写之后不会提示让 try catch的异常、代码编写错误导致,可避免)
  2. 非RuntimeException() 例如: IO异常、(会提示try catch的异常,不是代码编写错误导致的,只能抛出)
  3. unchecked异常RuntimeException + Error
  4. checked异常:非RuntimeException()

Spring的事务机制

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

  1. Spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚;
  2. 我们有时为了打印日志,会在service层捕获异常并打印日志,这时我们的所有异常都会被认为成checked异常。
  3. 为了事务的正常生效:当有try catch后捕获了异常,事务不会回滚, 如果不得不在service层写try catch 需要catchthrow new RuntimeException 让事务回滚;

处理方式

方法1

因为要保证当前方法具有返回值,在前端界面展示操作状态。

所以我们service层在添加了try catch日志打印后,抛出的runtime类异常需要在controller层进行捕获,捕获之后,在catch中编写操作失败后返回值的信息。

try {        
    userDao.save(user);        
    userCapabilityQuotaDao.save(capabilityQuota);       
} catch (Exception e) {       
    throw new RuntimeException();       
}

方法2 (推荐)

service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常了

try {        
    userDao.save(user);        
    userCapabilityQuotaDao.save(capabilityQuota);        
} catch (Exception e) { 
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();       
}

方法3

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常
  • Spring的事务机制
  • 处理方式
    • 方法1
      • 方法2 (推荐)
        • 方法3
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档