SpringBoot学习笔记(8):事物处理

SpringBoot学习笔记(8):事物处理

快速入门

  在传统的JDBC事务代码开发过程中,业务代码只有一部分,大部分都是与JDBC有关的功能代码,比如数据库的获取与关闭以及事务的提交与回滚、大量的try..catch..finally语句。

  Spring Boot利用AOP为我们提供了一个数据库事务的约定流程。通过这个约定流程就可以减少大量的冗余代码和一些没必要的异常捕获语句,让开发者更加集中于业务的开发,而不是反复编写如数据库的获取与关闭以及事务的提交与回滚、大量的try..catch..finally语句等。即只要我们遵循约定,就可以把自己开发的代码织入约定的流程中

  下图为Spring数据库事务约定:

  

声明式事务

  通过使用@Transactional标注告诉Spring在什么地方启用数据库事务功能。这个注解可以标注在类或者方法上,标注在类上表示这个类所有功能非静态的方法都启用事务功能

  在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

 

示例

添加注解1:@EnableTransactionManagement启动事物管理器

@SpringBootApplication
@EnableTransactionManagement
public class MsSupplyAndSaleApplication {public static void main(String[] args) {SpringApplication.run(MsSupplyAndSaleApplication.class, args);}
}

添加注解2:@Transaction在方法或类上启动事物处理

@Service
public class GoodsService {@Autowiredprivate GoodsMapper goodsMapper;@Transactionalpublic void addGoods(Goods goods){goodsMapper.addGoods(goods);}//....      
}

 

隔离级别

  隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读。

  • DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是:READ_COMMITTED
  • READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
  • READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
  • REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。
  • SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

指定事物的隔离级别:

@Transactional(isolation = Isolation.DEFAULT)

传播行为

  所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

  • REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED

指定事物的传播行为:

@Transactional(propagation = Propagation.REQUIRED)

  

转载于:https://www.cnblogs.com/MrSaver/p/8723559.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nignx出现failed (3: The system cannot find the path specified)问题

一般这个问题都是都是nginx.conf配置出现问题导致的。 仔细检查location配置等信息&#xff0c;核对error.log中显示路径是否产生跳转&#xff0c;核对跳转路径是否正确来推断自己配置是否有误。 如果无误的话。 查看window下或linux下的nginx进程是否出现多个进程&#xff…

nignx处理Html中SSI技术代码注意事项

当我们将服务部署至Nignx中时&#xff0c;想要页面静态化后的Html文件使用SSI技术获取包含页面内的js代码时。 需要注意的是&#xff0c;当我们从nignx访问动态地址时&#xff0c;返回的页面结果一定要是html页面才可以支持SSI技术&#xff0c;jsp是不支持SSI的&#xff0c;所…

Mybatis异常Invalid bound statement (not found): com.xxx.xxxMapper.selectxxxByxxx

这个异常问题的解决办法就是首先&#xff0c;检查Mapper文件配置是否有误&#xff0c;返回类型和bean是否对应。如果bean和mapper文件都无问题&#xff0c;可以检查一下Mapper注解的导包问题&#xff0c;导包错误也会导致这个问题

如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

代码的环复杂度(Cyclomatic complexity&#xff0c;有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准&#xff0c;在1976年由Thomas J. McCabe, Sr. 提出。 在软件测试的概念里&#xff0c;圈复杂度用来衡量一个模块判定结构的复杂程度&#xff0c;数量上表现为独立线性路…

利益相关者课后作业

课堂讨论记录&#xff1a; 1.目标&#xff1a;创新平台填报系统设计 2.形式&#xff1a;结构化的形式 3.基本规则&#xff1a;自由&#xff0c;平等&#xff0c;公正 4.个人想法 第一轮 司宇航&#xff1a;一定要关注高层利益相关者的利益。 刘宏琦&#xff1a;满足填报人的大部…

ZuulFilter的使用场景

各个微服务的访问需要网关统一管理进行跳转&#xff0c;而在访问网关时&#xff0c;我们可以进行增强功能&#xff0c;通过过虑器实现请求过虑&#xff0c;身份校验 等。 /*** 身份校验过滤器*/ Component public class LoginFilter extends ZuulFilter {AutowiredAuthServic…

机器学习实战 k-近邻算法 手写识别系统

转载于:https://www.cnblogs.com/crysa/p/8735556.html

Fegin拦截器解决各微服务之间数据下沉

上篇说了当前端访问微服务网关&#xff0c;借助ZuulFilter过滤器来过滤所有请求&#xff0c;获取request&#xff0c;判断cookie是否有身份短令牌&#xff0c;request的header中是否有Jwt令牌&#xff0c;redis中是否有Jwt令牌。但是这个数据传递只能是前端访问微服务时&#x…

免杀原理与实践

杀软原理 目前杀毒软件的原理主要有3种&#xff1a; 1.引擎与病毒库的交互作用&#xff0c;通过特征码提取与病毒库中的特征码进行比对识别病毒。 2.启发式Heuristic&#xff0c;通过程序的一些行为和特征来判断。 3.在虚拟机技术上的启发式&#xff0c;通过建立一个虚拟环境运…

分布式事务的理解和解决方法

什么是分布式事务&#xff1f; 什么是分布式系统?部署在不同结点上的系统通过网络交互来完成协同工作的系统。 比如&#xff1a;充值加积分的业务&#xff0c;用户在充值系统向自己的账户充钱&#xff0c;在积分系统中自己积分相应的增加。充值系统和积分系统是两个不同的系统…

delphi 搭建安卓开发环境

delphi 搭建安卓开发环境 DELPHI安装成功以后&#xff0c;怀着激动的心情&#xff0c;使用IDE向导生成安卓DEMO程序&#xff0c;BUILD&#xff0c;想马上看到编译成功的提示&#xff0c;结果报错&#xff0c;不由得傻眼了。DELPHI怎么这么差&#xff1f; 原来DELPHI安装成功以后…

ServiceComb抛出llegalStateException: The schema(id=[xxx]) ...异常解决办法

其实这个异常就是无法说你启动的这个servicecomb实例和注册中心的实例不匹配&#xff0c;并且信息已经被占用。 所以解决办法就是&#xff1a;启动注册中心前端界面进程&#xff0c;进入界面&#xff0c;然后kill掉你要启动的servicecomb实例在微服务注册中心的实例。然后重新…

关于Centos7启动,ens33无IP问题解决

今天启动虚拟机xshell6一直连不上&#xff0c;之前一直好好的&#xff0c;怎么突然连不上了&#xff0c;很奇怪&#xff0c;上去看看连接方式也没问题。 然后ip addr 一看ens33下无ip&#xff0c;然后就查资料解决&#xff0c;看到很多解决办法试了都没解决。 最后的解决办法…

9.获取当前时区时间和utc时间的工具方法

这是实际项目中使用到的工具方法&#xff0c;获取utc时间的使用方法和第一个类似&#xff0c;只是函数名不一样而已。 1.获取当前时区的时间 /** // 对Date的扩展&#xff0c;将 Date 转化为指定格式的String // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占…

错误:docker-ce-cli conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64 错误:docker-ce confli

安装K8S的时候提示这个问题&#xff0c;原因就是虚拟机中已经装了docker-ce和docker-ce-client 卸载了docker然后重装k8s就好了 yum -y remove docker-ce yum -y remove docker-ce-client

POJ2398【判断点在直线哪一侧+二分查找区间】

题意&#xff1a;同POJ2318 #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; struct point {int x, y; }; struct Node {point Low, High; }line[5010];int Num[5010]; int par[5010]; bool cmp(Node…

Xshell6突然连不上K8S所在的虚拟机

哎&#xff0c;最近一直出现部署运维问题&#xff0c;就很头疼&#xff0c;很影响进度。 今天早上xshell6突然就连不上虚拟机了&#xff0c;在虚拟机内部Ping百度也是没问题的。 但是xshell就是不给连&#xff0c;看xm的dhcp也在。 如果是VMnetDhcp服务关闭&#xff0c;重启…

synchronized(九)

在Java中是有常量池缓存的功能的&#xff0c;就是说如果我先声明了一个String str1 “a”; 再声明一个一样的字符串的时候&#xff0c;取值是从原地址去取的&#xff0c;也就是说是同一个对象。这也就导致了在锁字符串对象的时候&#xff0c;可以会取得意料之外的结果&#xf…

使用jQuery的ajax同步请求吃过的亏

jQuery是一个非经常常使用的js库。甚至我们开发不论什么一个项目都首先把jquery导入进行。jQuery太过强大&#xff0c;使用起来非常方便。可是在使用的过程中也遇到过非常多坑。我在这里分享一下。避免大家也遇到相同的问题束手无策&#xff0c;也方便以后回归学习。普通的写法…