当前位置: 首页 > news >正文

西宁手机网站微站建设/汕头网站设计公司

西宁手机网站微站建设,汕头网站设计公司,公司简介模板免费ppt下载,做经营网站怎么赚钱1、背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法。比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事物,这个方法在执行完之后,需要调用LogServi…

1、背景

在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法。比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事物,这个方法在执行完之后,需要调用LogService的insertLog方法记录一条日志,这个方法上也有事物,不管日志记录成功还是失败,都不能影响execTask方法的执行。因此我们很容易写出如下代码。

@Transactional
public void execTaskV1(){log.info("开始执行任务");try {logService.insertLogV1();} catch (Exception e) {log.error("添加日志出现错误");}log.info("完成任务执行");
}

思考: 上方的代码,如果insertLogV1跑出了异常,execTaskV1方法的事物可以正常提交吗?

2、异常是如何实现出现的

1、了解Spring事物的传播属性

传播行为描述应用场景行为特点
Propagation.REQUIRED如果当前存在事务,则加入该事务;如果当前没有事务,则启动一个新的事务。大多数场景,如多个方法需要在同一个事务中完成。- 如果当前事务存在,方法执行在当前事务上下文中。
- 如果当前事务不存在,创建新事务。
Propagation.SUPPORTS如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。对事务支持没有强制要求的场景,如只读查询。- 如果当前事务存在,方法执行在当前事务上下文中。
- 如果当前事务不存在,以非事务方式执行。
Propagation.MANDATORY如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。必须在一个已存在的事务中执行的场景。- 必须在已有事务中执行,否则抛出 IllegalTransactionStateException
Propagation.REQUIRES_NEW每次调用该方法时都会启动一个新的事务。当前事务(如果有)会被挂起。需要独立事务的场景,如日志记录或独立的业务操作。- 总是创建新事务。
- 当前事务(如果有)会被挂起,直到新事务完成。
Propagation.NOT_SUPPORTED总是以非事务方式执行,并且暂停当前事务(如果有)。不需要事务的场景,如简单的查询操作。- 总是以非事务方式执行。
- 暂停当前事务(如果有)。
Propagation.NEVER总是以非事务方式执行,如果当前存在事务,则抛出异常。严格禁止事务的场景,如某些非事务性操作。- 必须在非事务上下文中执行,否则抛出 TransactionException
Propagation.NESTED如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则启动一个新的事务。需要嵌套事务的场景,如复杂的业务流程中需要独立的回滚点。- 如果当前事务存在,创建一个嵌套事务(依赖于数据库支持)。
- 如果当前事务不存在,创建新事务。

2、模拟异常出现

Transaction rolled back because it has been marked as rollback-only 这个异常在上述的案例中是如何实现的呢?
异常出现
从上图中可知,出现了Transaction rolled back because it has been marked as rollback-only这个异常,那么这个异常是如何出现的呢?

其实这个是和Spring事物的传播属性Propagation有关。

默认情况下@Transaction的传播属性是Propagation.REQUIRED, 即如果当前存在事务,则加入该事务;如果当前没有事务,则启动一个新的事务。 在我们的例子中,事物的隔离级别都是Propagation.REQUIRED,即是在同一个事物中,因此insertLogV1方法抛出异常后,虽然上层捕获到了,但其实这个时候这个事物已经被标记成回滚状态了,因此事物无法提交成功。

如何解决: 只需要修改insertLogV1事物的传播属性为Propagation.REQUIRES_NEW即可。

3、完整代码

完整代码-https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-transaction-v1

http://www.bjxfkj.com.cn/article/315.html

相关文章:

  • 赣州网站设计/网站如何发布
  • 关键词做网站名字/郑州百度seo网站优化
  • 汽车门户网站建设/seo视频教程百度云
  • 杭州专业设计网站/北京排名seo
  • 哪个网站可以做logo/郑州seo外包公司哪家好
  • 兰州网站建设/湖南百度seo
  • 网站程序源码下载/绍兴seo排名公司
  • 做兼职 那个网站靠谱/企业网站模板源码
  • 集团网站建设计划表百度/全网推广推荐
  • ppt模板网站下载/seo的五个步骤
  • 公司展厅设计图片/神马搜索seo优化排名
  • 连网站建设/广州seo推广服务
  • 南京网站设计是什么/百度收录关键词查询
  • 别人网站 自己的域名/网站排名seo教程
  • 怎么搭建一个完整的网站/阿里指数数据分析平台官网
  • 营销型网站建设课程/爱站网综合查询
  • 2003系统做网站/竞价账户托管公司
  • 徐州网站推广优化/免费顶级域名注册网站
  • 濮阳建设工程网站/外包公司是正规公司吗
  • 中国建设银行网站首页e路护航/网站建站系统
  • 营销师/廊坊seo管理
  • 可以做微信推文的网站/怎么样推广最有效最快速
  • 网址大全介绍/潍坊网站建设seo
  • 域名 和网站有什么区别吗/互联网推广销售
  • 网站后台页面是什么/网站推广的方法有哪些?
  • 做网站网址/广告投放代理商加盟
  • 北京网站建设定制/网站自动提交收录
  • 做响应式网站的框架/企业网络推广平台
  • 安徽智能网站建设推荐/包就业的培训学校
  • 龙口做网站哪家好/网站宣传推广文案