iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在springBoot中利用service实现层事务控制的操作
  • 951
分享到

怎么在springBoot中利用service实现层事务控制的操作

2023-06-06 11:06:41 951人浏览 八月长安
摘要

怎么在SpringBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springBoot使用事物比较简单,在Appl

怎么在SpringBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

springBoot使用事物比较简单,在Application启动类s上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional注解

@Transactional属性

属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

用法:

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。

另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring aop 的本质决定的。

如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

注解在方法上:

@Autowired private mybatisDao dao; @Transactional @Override public void insert(Test test) {  dao.insert(test);  throw new RuntimeException("test");//抛出unchecked异常,触发事物,回滚 }
 @Transactional(noRollbackFor=RuntimeException.class)  @Override  public void insert(Test test) {   dao.insert(test);   //抛出unchecked异常,触发事物,noRollbackFor=RuntimeException.class,不回滚   throw new RuntimeException("test");  }
@Transactional(propagation=Propagation.NOT_SUPPORTED) @Override public void insert(Test test) {  //事物传播行为是PROPAGATION_NOT_SUPPORTED,以非事务方式运行,不会存入数据库  dao.insert(test); }

注解在类上:当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性

@Transactional public class MyBatisServiceImpl implements MyBatisService {  @Autowired  private MyBatisDao dao;     @Override  public void insert(Test test) {   dao.insert(test);   //抛出unchecked异常,触发事物,回滚   throw new RuntimeException("test");  }

注意:有时候在开发时往往出现了添加注解后却无法回滚

原因:默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。

spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚

换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚。

解决方案:

在service层方法抛出RuntimeException异常(如在Catch中需要抛出自定义的异常则只需自定义异常继承RuntimeException即可),并继续捕获和处理这个异常。

在service层方法的catch语句中增加:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

语句,手动回滚,这样上层就无需去处理异常。

补充:springboot多个service互相调用的事务处理

今天,想在一个service的方法A中,调用另一个service的方法B,方法A和方法B均存在数据库插入操作,并且@Transaction注解也都加了,但是当B方法中抛出异常时,A中的插入语句还是能够执行成功。

注解配置如下:

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)

百思不得其解,再查找了相关资料后,问题还是出在@Transaction注解的配置上,需要配置异常回滚。

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED,rollbackFor = Exception.class)

这样,当B方法中抛出异常时,A中的操作也会进行回滚,事务就会起到控制作用。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 怎么在springBoot中利用service实现层事务控制的操作

本文链接: https://www.lsjlt.com/news/246833.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在springBoot中利用service实现层事务控制的操作
    怎么在springBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springBoot使用事物比较简单,在Appl...
    99+
    2023-06-06
  • SpringBoot在自定义类中怎么样调用service层等Spring其他层操作
    这篇文章给大家分享的是有关SpringBoot在自定义类中怎么样调用service层等Spring其他层操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景:做了一个TCP服务器来接入智能设备,然后需要将设备实...
    99+
    2023-06-15
  • SpringBoot中怎么利用Sentinel实现接口流量控制
    这期内容当中小编将会给大家带来有关SpringBoot中怎么利用Sentinel实现接口流量控制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。项目搭建首先我们来创建一个测试项目,这里初始化项目的url建议...
    99+
    2023-06-15
  • SpringBoot中的Get与Post请求怎么利用Restful service实现
    SpringBoot中的Get与Post请求怎么利用Restful service实现?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. Get请求,url传参,返回jso...
    99+
    2023-05-31
    springboot restful service
  • Python怎么利用appium实现模拟手机滑动操控的操作
    这篇“Python怎么利用appium实现模拟手机滑动操控的操作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎...
    99+
    2023-07-02
  • VB.NET中怎么实现事务处理操作
    VB.NET中怎么实现事务处理操作,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。要定义一个事务,需要使用Begin tran命令,在这一命令之后的任何语句都将被认为是事务的...
    99+
    2023-06-17
  • 怎么在Spring中利用@Transactional实现事务回滚
    今天就跟大家聊聊有关怎么在Spring中利用@Transactional实现事务回滚,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、使用场景举例在了解@Transactional怎...
    99+
    2023-05-30
    spring transactional
  • 怎么在python中利用BytesIO操作二进制数据
    今天就跟大家聊聊有关怎么在python中利用BytesIO操作二进制数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发...
    99+
    2023-06-14
  • 怎么在SpringBoot中利用Prometheus和Grafana实现实现应用监控和报警功能
    这篇文章将为大家详细讲解有关怎么在SpringBoot中利用Prometheus和Grafana实现实现应用监控和报警功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。SpringBoot的...
    99+
    2023-06-06
  • 如何在Cassandra中实现数据的事务性操作
    Cassandra是一个分布式数据库系统,不支持传统关系型数据库中的ACID事务。Cassandra的设计目标是为了提供高可用性和横...
    99+
    2024-04-09
    Cassandra
  • 怎么在Java中利用JDBC实现一个事务功能
    本文章向大家介绍怎么在Java中利用JDBC实现一个事务功能,主要包括怎么在Java中利用JDBC实现一个事务功能的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java是什么Java是一门面...
    99+
    2023-05-30
  • Spring Boot中怎么利用Redis 实现缓存操作
    这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-...
    99+
    2023-06-17
  • PL/SQL中的事务管理与并发控制怎么实现
    在PL/SQL中,事务管理和并发控制可以通过使用事务控制语句和锁机制来实现。 事务控制语句包括BEGIN TRANSACTION、C...
    99+
    2024-05-07
    PL/SQL
  • SQL Server中怎么实现事务操作隔离模式
    这期内容当中小编将会给大家带来有关SQL Server中怎么实现事务操作隔离模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  1.脏数据读写,这种情况发生在当一个事务...
    99+
    2024-04-02
  • PostgreSQL中怎么利用DBLink实现自治事务
    本篇文章给大家分享的是有关PostgreSQL中怎么利用DBLink实现自治事务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。安装dblink...
    99+
    2024-04-02
  • JavaBean中怎么利用JDBC实现事务处理
    今天就跟大家聊聊有关JavaBean中怎么利用JDBC实现事务处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JDBC(Java Data Base Connectivity,ja...
    99+
    2023-06-17
  • WinForms中怎么实现控件之间的拖放操作
    在WinForms中实现控件之间的拖放操作可以通过以下步骤实现: 将要拖动的控件的 AllowDrop 属性设置为 true,以...
    99+
    2024-03-12
    WinForms
  • SpringBoot中的利用Email发送功能怎么利用Thymeleaf实现
    本篇文章为大家展示了SpringBoot中的利用Email发送功能怎么利用Thymeleaf实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。添加依赖(Mail starter dependenci...
    99+
    2023-05-31
    springboot thymeleaf email
  • 怎么在SpringBoot中利用WebSocket实现一个群聊功能
    本篇文章为大家展示了怎么在SpringBoot中利用WebSocket实现一个群聊功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。消息群发创建新项目:添加依赖:<dependency>...
    99+
    2023-06-06
  • Linux中怎么利用iptables实现备份和恢复操作
    Linux中怎么利用iptables实现备份和恢复操作,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 1、iptables的配置文件位置:/etc/s...
    99+
    2023-06-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作