事务(Transaction)

2023-10-30

事务(Transaction)

事务:是数据库中的可以保证多个(至少2个)写操作(增、删、改)要么全部执行成功,要么全部执行失败的机制!

在基于Spring JDBC的项目中,使用@Transactional注解,即可使得注解的方法是事务性的。

关于@Transactional注解,可以添加在:

  • 接口上

    • 等效于在每个抽象方法上添加了此注解

  • 接口的抽象方法上

    • 仅作用于当前方法(重写的方法运行时)

  • 实现类上

    • 等效于在每个重写的接口的方法上添加了此注解

  • 实现类中重写的接口的方法上

    • 仅作用于当前方法

提示:此注解可以配置一些参数,如果同时在接口/类、接口的抽象方法/类重写的方法上添加此注解并配置了不同的参数值,则以方法上的配置为准。  

注意:Spring JDBC是基于接口的代理模式来实现事务管理的!所以,如果在实现类中的自定义方法上添加@Transactional注解是错误的做法!仅当对应的方法是在业务接口中已经声明的,使用@Transactional才是正确的!  

关于事务处理过程中的几个概念:

  • 开启事务:BEGIN

  • 提交事务:COMMIT

  • 回滚事务:ROLLBACK

在Spring JDBC的事务管理中,大致是:

开启事务
try {
	执行你的业务方法
	提交事务
} catch (RuntimeException e) {
	回滚事务
}

 可以看到,Spring JDBC的事务管理中,默认将根据RuntimeException进行回滚,可以通过@Transactional注解的rollbackFor / rollbackForClassName这2个属性中的某1个进行修改,设置为对特定的异常进行回滚,还可以配置noRollbackFor / noRollbackForClassName这2个属性,设置对特定的异常不回滚。

【小结】关于事务:

  • 如果某个业务方法涉及超过1次的增、删、改操作,需要保证此业务方法是事务性的;

  • 推荐在业务的抽象方法上添加@Transactional注解即可保证此业务方法是事务性

    • 对于初学者,更推荐在业务接口上添加@Transactional,则此接口中所有抽象方法都是事务性,可能其中的某些抽象方法并不需要是事务性的,但是,这种做法比较稳妥,能避免遗漏导致的错误

  • 为了保证事务能够按照预期进行回滚,需要:

    • 业务层必须由接口和实现类组成

      • Spring JDBC是基于接口代理模式实现事务管理的,如果没有接口,则无法实现

    • 所有增、删、改操作完成后,应该及时获取返回结果,并对结果进行判断,如果结果不符合预期,应该抛出异常,且异常应该是RuntimeException或其子孙类异常

      • Spring JDBC在管理事务时,默认按照RuntimeException进行回滚

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

事务(Transaction) 的相关文章

  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • 插入数据时,保存的date类型时间字段的数据只有年月日,没有时分秒的问题

    本人使用的hibernate实体类映射方式 在实体类中date类型的注解方式 默认生成的是 Temporal TemporalType DATE 在保存的时候 此字段数据就只保留了年月日 将注解方式更改为 Temporal Temporal
  • VIM编辑文件权限问题:"E45: 'readonly' option is set (add ! to override)"

    玩阿里云更换了CentOs7 3搭建LAMP环境的时候 遇到vim打开了某个 etc下的文件 文件权限777 使用 w wq 保存的时候提示 E45 readonly option isset add to override 而用 w 提示
  • vlc android tv版,VLC播放器电视版本v1.6.0 Android版本

    VLC播放器电视版是一款非常经典且易于使用的媒体播放器 适合Android智能电视和box 它是免费的 开源的 跨平台的 广告免费的 强大的 并且有一个干净的用户界面 它支持各种流媒体协议 它有三种解码方法 完全解码 硬件解压和软件解码am
  • CVPR2022论文分享会--复盘

    小白一枚 这一天听下来最感兴趣的一篇paper 后续等小编看完这个paper在更新详细讲解 大卷积核神经网络设计 微软亚洲研究院 张祥雨 1 作者根据对ViT 的思考以及大卷积核的引出 RACV2021观点集锦 视觉transformer
  • mx-link无线打印服务器,TP-LINK USB Printer Controller(TP-LINK打印服务器)

    TP LINK USB Printer Controller是款功能实用的TP LINK打印服务器控制程序 它是使用率比较高 该软件也受到了许多用户的欢迎 主要的目的就是让用户的双频无线路由器上面的USB口对打印机的共享 让局域网主机的打印
  • 数据结构与算法(九)—— 图(无向图)

    在现实生活中 有许多应用场景会包含很多点以及点点之间的连接 而这些应用场景我们都可以用即将要学习的图这种数据结构去解决 1 图的定义及分类 图是由一组顶点和一组能够将两个顶点相连的边组成的 1 自环 即一条连接一个顶点和其自身的边 2 平行
  • 1905协议详解(二)IEEE 1905.1 拓扑发现协议

    目录 3 IEEE 1905 1 topology discovery 协议 3 1 IEEE 802 1 bridge discovery 3 2 Topology discovery protocol 3 2 1 Multicast d
  • oracle 11g---------启动、关闭数据库实例

    Oracle数据库实例的启动过程分为三个步骤 分别是 启动实例 加载数据库 打开数据库 用户可以根据实际情况的需要 以不同的模式启动数据库 启动数据库所使用的命令格式如下 startup nomount mount open force r
  • valid-palindrome

    题目描述 Given a string determine if it is a palindrome considering only alphanumeric characters and ignoring cases For exam
  • Python使用HTTP代理 Proxy

    urllib2 urllib 代理设置 urllib2是Python标准库 功能很强大 只是使用起来稍微麻烦一点 在Python 3中 urllib2不再保留 迁移到了urllib模块中 urllib2中通过ProxyHandler来设置使
  • 一文搞懂linux磁盘管理以及各场景扩容需求(实操)

    Linux常见磁盘分类 在linux上面 我们经常见到sda sdb hda hdb这样的磁盘显示 sd hd表示硬盘 sd表示硬盘是scsi接口 a表示第一块插槽盘 b表示第二块插槽盘 hd表示硬盘是IDE接口 同理a表示第一块插槽盘 b
  • Linux下.ko, .o, .so, .a, .la文件

    能上线啦 CSDN博客第二期云计算最佳博主评选 Linux下 ko o so a la文件 分类 Linux 系列 2011 12 12 23 30 2669人阅读 评论 0 收藏 举报 linux gcc makefile library
  • 微信分享审请AppID、AppSecret注意问题

    微信 审请AppID AppSecret http open weixin qq com 账号 qq com 密码 步骤 1 填写应用名称 简介相应信息 上传图片 2 填写平台信息 官网 平台类型 下载地址 应用签名 应用包名 3 提交信息
  • 面向对象是什么?

    一 面向对象是什么面向对象 Object Oriented OO 的思想对软件开发相当重要 它的概念和应用甚至已超越了程序设计和软件开发 扩展到如数据库系统 交互式界面 应用结构 应用平台 分布式系统 网络管理结构 CAD 技术 人工智能等
  • 一致性hash算法原理及golang实现

    概述 这里存在一种场景 当一个缓存服务由多个服务器组共同提供时 key应该路由到哪一个服务 这里假如采用最通用的方式key N N为服务器数目 这里乍一看没什么问题 但是当服务器数目发送增加或减少时 分配方式则变为key N 1 或key
  • Sentinel 熔断与限流

    文章目录 1 是什么 2 特征 3 特性 4 与Hystrix的区别 5 两个部分 6 应用 6 1 依赖 6 2 配置文件 7 流量配置规则 7 1 直接 默认 7 2 关联 7 3 Warm Up 预热 7 4 排队等待 8 熔断降级
  • 第一个Java程序,简单的打开图片并显示在面板上

    代码如下 1 import java awt Component 2 import java awt EventQueue 3 import java awt Graphics 4 import java awt event 5 impor
  • Linux (Ubuntu、CentOS) 如何 [禁用/启用] 图形界面

    Linux Ubuntu CentOS 如何 禁用 启用 图形界面 禁用图形界面本质就是调整 linux 的运行级别 runlevel PS 这里不讨论 GUI Desktop 的安装与卸载 一 什么是 Linux 运行级别 linux 操
  • Git删除本地修改

    git如何删除本地所有未提交的更改 git checkout git clean xdf 一般 git clean都是配合git reset 使用的 如果你有的修改已经加入了暂存区 那么 命令git reset hardgit clean
  • 事务(Transaction)

    事务 Transaction 事务 是数据库中的可以保证多个 至少2个 写操作 增 删 改 要么全部执行成功 要么全部执行失败的机制 在基于Spring JDBC的项目中 使用 Transactional注解 即可使得注解的方法是事务性的