事务以及@Transcational注解

文章目录

  • 1.事务的概念
  • 2.事务的四个特性
  • 3.关于@Transcational注解的理解
  • 4.使用场景
  • 5.举例
  • 6.编程式事务管理
  • 7.相关知识

1.事务的概念

事务,是指作为单个逻辑工作单元执行的一系列操作,结果只有成功和失败两种,要么全部成功(全部提交),要么全部失败(全部回滚),即使成功了一部分,也视为失败,执行全部回滚操作。

2.事务的四个特性

原子性(Atomicity):对数据进行操作的时候,要么全部执行,要么全部不执行;
一致性(Consistency):和原子性密切相关,事务执行成功,就使数据库从一个一致性状态改变到另一个一致性状态;
隔离性(Isolation):一个事务的执行,不会被其他事务干扰;
持续性(Durability):事务一旦提交成功,那么数据库里的数据就会永久性地改变;

3.关于@Transcational注解的理解

spring支持"编程式事务管理"和"声明式事务管理"两种方式。

而@Transcational注解,就属于使用声明式事务管理,声明式事务管理是建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务最大的优点是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明(或通过@Transcational注解的方式),便可以将事务规则应用到业务逻辑中。

这种非侵入式的开发方式,是spring所提倡的,也正是这样,声明式事务优于编程式事务。

声明式事务唯一的不足是,它最细程度只能达到方法级别,而编程式事务可以作用到代码块级别,弥补的办法是可以将需要进行事务管理的代码块独立为方法等。

4.使用场景

@Transcatinal 可以作用于接口、接口方法、类以及类方法上,当作用于类上时,该类的所有public方法都将具有该类型的事务属性,我们也可以在方法级别使用该标注来覆盖类级别的定义。
spring不建议将@Transcational使用在接口或者接口方法上,因为只有在使用基于接口的代理时它才会生效。
另外,@Transcational注解应该只被应用到public方法上,因为只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,故只能是public方法,在protected、private或者默认的方法上使用,同时不能使用static的修饰符,若使用则会被忽略,也不会报任何异常。

5.举例

@Transactional(rollbackFor = Exception.class)

我们举例使用的@Transactional(rollbackFor = Exception.class),如果标注在一个方法上,表示在该方法抛出任何异常时,进行事务的回滚动作。

spring不止对捕获数据访问异常才会进行回滚,而是只要捕获到了运行时异常都会进行回滚。

在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor =Exception.class,可以让事物在遇到非运行时异常时也回滚。

6.编程式事务管理

 public FunctionResult delete(List<String> standardIdList) {if (standardIdList==null||standardIdList.size()==0){return new FunctionResult(ErrorCode.SpeExaStandardDeleteListIsNull);}TransactionStatus transactionStatus=transactionManager.startTransaction();int cnt = 0;for(String standardId:standardIdList) {try {cnt = speExaStandardDOMapper.deleteByPrimaryKey(standardId);}catch (Exception e){LogHelper.fatal(e.getMessage(),e);return new FunctionResult(ErrorCode.SpecialExaminationStandardDeleteFail);}finally{if (cnt <= 0) {transactionManager.rollback(transactionStatus);}else{transactionManager.commit(transactionStatus);}}}return new FunctionResult(ErrorCode.Success);}

7.相关知识

@transactional作用和事务

@Transcational的原理和使用

spring声明式事务 同一类内方法调用事务失效

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

@Transactional(rollbackFor=Exception.class)的使用

Spring事务管理实现方式之编程式事务与声明式事务详解

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

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

相关文章

提高代码复用率

由于现在的互联网企业业务比较繁忙&#xff0c;导致产品狗不停地提需求&#xff0c;还总是改来改去&#xff0c;最后留给程序猿的时间少之又少。程序猿也不是吃素的&#xff0c;干脆直接copy一下代码随便搞一下实现功能就行&#xff0c;也谈不上所谓的精心设计了。这样的确是缩…

java 对 redis 的基本操作

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、server端安装 1、下载https://github.com/MSOpenTech/redis 可看到当前可下载版本&#xff1a;redis2.6 2、安装 1&#xff09;解压…

JsRender 前端渲染模板常用API学习

JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的&#xff0c;使用的情况有以下几种。 把html字符串编译编译成模板获取使用script标签声明的模板&#xff0c;并返回一个模板对象把html字符串或者在script标签中声明的模板注册成命名模板获取之前就…

状态图

状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。

我身边的手机应用开发者

手机应用火了&#xff0c;我身边的一位朋友(A君)也投身到开发者行列&#xff0c;不过他还算聪明并没有辞掉工作专做手机应用软件开发。 其原因在于他们领导打算做一款自己的应用软件&#xff0c;正当A君愁到底是做IOS平台还是Android平台的时候&#xff0c;领导说&#xff1a;…

学成在线--16.添加课程计划

文章目录一.需求分析二.API接口三.后端1.Dao2.Service3.Controller4.测试四.前端1.页面原型说明1&#xff09;添加按钮2&#xff09;视图部分3&#xff09;在数据模型中添加如下变量4&#xff09;定义表单提交方法和重置方法2.Api调用1&#xff09;定义 api方法2&#xff09;调…

mac 下的操作

nodejs在Mac下的卸载 在 node 官网上下载的安装包&#xff0c;用安装包安装的node.应该可以用一下命令行卸载&#xff1a; 在终端输入以下命令&#xff1a; sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 删除/usr/local/lib中的…

理解 maven 的核心概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 本文以类图的方式&#xff0c;介绍 maven 核心的 12 个概念及相互之间的关系。 Table of Contents 1 maven管理的目标&#xff1a;工程…

时间跟踪图

事件跟踪图实质上是扩充的脚本&#xff0c;可以认为事件跟踪图是简化的UML顺序图。

1088. [SCOI2005]扫雷Mine【网格DP】

Description 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。万圣节到了 &#xff0c;“余”人国流行起了一种简单的扫雷游戏&#xff0c;这个游戏规则和扫雷一样&#xff0c;如果某个格子没有雷&#xff0c;那么它里面的数…

spring data jpa和mybatis的不同

使用spring data JPA和mybatis都是用来访问数据库&#xff0c;但他们的分工不同&#xff1a; 1.spring data jpa默认使用hibernate作为ORM实现&#xff0c;是spring 提供的一套jpa接口&#xff0c;使用spring data jpa主要完成一些简单的增删改查功能。 2.对于复杂的查询功能会…

函数式编程很难,这正是你要学习它的原因

很奇怪不是&#xff0c;很少有人每天都使用函数式编程语言。如果你用Scala&#xff0c;Haskell&#xff0c;Erlang&#xff0c;F#或某个Lisp方言来编程&#xff0c;很可能没有公司会花钱聘你。这个行业里的绝大部分人都是使用像Python&#xff0c;Ruby&#xff0c;Java或C#等面…

函数依赖

设R(U)是一个属性集U上的关系模式&#xff0c;X和Y是U的子集。若对于R(U)的任意一个可能的关系r&#xff0c;r 中不可能存在两个元组在X上的属性值相等&#xff0c; 而在Y上的属性值不等&#xff0c; 则称“X函数确定Y”或“Y函数依赖于X”&#xff0c;记作X→Y。 X→Y&#x…

Java面试——线程池

1、类比介绍 假如有一个工厂&#xff0c;工厂里面有10个工人&#xff0c;每个工人同时只能做一件任务。 因此只要当10个工人中有工人是空闲的&#xff0c;来了任务就分配给空闲的工人做&#xff1b; 当10个工人都有任务在做时&#xff0c;如果还来了任务&#xff0c;就把任务进…

C#关键字的使用

params object[] 用于函数多参数的定义public static void Write(string format, params object[] arg);explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 例如&#xff0c;在下面的示例中&#xff0c;此运算符将名为 Fahrenheit 的类转换为名为 Ce…

maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 参考&#xff1a;http://zhaoshijie.iteye.com/blog/2094478http://blog.csdn.net/cpf2016/article/details/45674377 还有一篇转载文章…

学成在线--17.我的课程

文章目录一.需求分析二.API接口三.PageHelper1.PageHelper介绍2.添加依赖3.配置pageHelper四.Dao1.mapper 接口2.mapper.xml映射文件3.测试Dao五.Service六.Controller七.前端1.创建course_list.vue2.路由3.定义API方法4.前端视图course_list.vue详解1&#xff09;API调用--在视…

码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性或属性集合&#xff0c;他是整个实体集的性质&#xff0c;而不是单个实体的性质。 主属性与非主属性 包含在任何一个候选码中的属性 &#xff0c;称为主属性&#xff08;Prime attribute&#xff09;。 不包含在任何…

关于C编程的一点感受

刚毕业的时候用了两个多月的C语言编程&#xff0c;总的来说对它还是很有感受的&#xff0c;C是一个过程式语言&#xff0c;没有像C,Java等OOP语言这样那样的一系列的规则和限制&#xff1b;它比较灵活&#xff0c;简洁&#xff0c;高效&#xff1b;这些是给我的印象最深的。这是…

如何打造高效的多任务、高并发的网络服务器系统?

同一个功能的软件&#xff0c;不同的团队&#xff0c;不同工程师去实现&#xff0c;肯定是千差万别&#xff0c;甚至从根本上完全不同。所以软件开发在未来很长时间内仍然是一项工匠的手工劳动&#xff0c;尤其像多任务&#xff0c;高并发&#xff0c;偏底层这种对实现技巧比较…