transaction事务使用

事务的特性

事务有以下四个特性,通常称为ACID:

  1. 原子性(Atomicity): 事务是一个不可分割的基本工作单位,在事务执行过程中,要么全部执行成功,要么全部失败回滚。

  2. 一致性(Consistency): 在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。在事务执行过程中,数据库总是从一个一致性状态转移到另一个一致性状态。

  3. 隔离性(Isolation): 对于任何两个并发事务,在系统中的操作好像是顺序执行的,其中一个操作的结果不受另一个操作的影响。

  4. 持久性(Durability): 一旦提交事务,对数据所做的更改就会永久保存到数据库中,即使系统发生故障,这些更改也应该得以保存。

这些特性确保了数据库事务的可靠性和一致性,也是数据库管理系统(DBMS)的重要功能之一。

开启事务的方式

在基于Spring框架的应用中,可以通过以下几种方式来开启事务

  1. 使用注解方式:通过在方法上添加@Transactional注解来启用事务。可以将@Transactional注解添加在类级别上,表示该类的所有方法都被视为事务性操作,也可以只在特定的方法上添加注解,表示该方法是一个事务性操作。
    @Transactional
    public class ExampleService {public void doSomething() {// 事务性操作}
    }

  2. 使用XML配置方式:通过在Spring的配置文件中声明<tx:annotation-driven />来启用注解驱动的事务管理,并使用<tx:advice><aop:config>元素配置事务增强。
    <beans xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"><tx:annotation-driven /><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 声明事务增强 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" propagation="REQUIRED" /></tx:attributes></tx:advice><!-- 配置事务切面 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.service.*.*(..))" /></aop:config></beans>

  3. 通过Spring提供的TransactionTemplatePlatformTransactionManager来创建事务。
  4. .//使用TransactionTemplate
    @Autowired
    private PlatformTransactionManager transactionManager;public void performTransactionalOperation() {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);transactionTemplate.execute(new TransactionCallback<Void>() {@Overridepublic Void doInTransaction(TransactionStatus status) {try {// 在这里执行事务操作,如数据库的增删改操作等} catch (Exception ex) {status.setRollbackOnly(); // 如果出现异常,设置回滚事务throw ex;}return null;}});
    }
    //使用PlatformTransactionManager
    @Autowired
    private PlatformTransactionManager transactionManager;public void performTransactionalOperation() {TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(transactionDefinition);try {// 在这里执行事务操作,如数据库的增删改操作等transactionManager.commit(status); // 如果没有异常,提交事务} catch (Exception ex) {transactionManager.rollback(status); // 如果出现异常,回滚事务throw ex;}
    }

这些方式都基于Spring事务管理器的能力来创建和管理事务。注意,在使用事务期间,应该遵循正确的异常处理和事务提交/回滚的方式,以确保事务的完整性和一致性。

使用事务的基本流程
  1. 开始事务。在执行任何数据库操作之前,应该通过命令或API来显式地开始一个新的事务。

  2. 执行数据库操作。在事务中,可以执行多个增删改查等数据库操作语句,以及开发人员自己的代码逻辑,这些操作会被当做一个整体来处理。

  3. 提交事务或回滚事务。当所有的操作都执行成功,没有发生任何错误或异常时,应该通过命令或API显式地提交事务;如果其中任何一个操作失败或出现异常,则应该回滚整个事务,使得所有操作都不会造成任何影响。

  4. 结束事务。在提交或回滚事务之后,需要通过命令或API来显式地结束该事务。

需要注意的是,在多数编程语言和数据库中,事务必须在同一个数据库连接上使用,以确保事务中的所有操作都在同一会话下被处理。另外,当使用事务时,应该避免过长的事务处理时间,因为这会影响数据库的并发性能。

事务的嵌套使用

事务的嵌套使用是指在一个事务的执行过程中,调用了另一个需要事务的方法。在Spring框架中,可以使用Propagation属性来控制事务的传播行为。

在Spring中,Propagation属性有不同的取值,常用的包括:

  • Propagation.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则新建一个事务。
  • Propagation.REQUIRES_NEW:无论当前是否存在事务,都新建一个事务,并将当前事务挂起。
  • Propagation.NESTED:如果当前存在事务,则在一个嵌套事务中执行;如果当前没有事务,则行为类似于Propagation.REQUIRED

首先,确保你的代码中已经开启了事务。可以通过在方法上添加@Transactional注解来实现。

然后,在需要嵌套事务的方法中,使用不同的Propagation属性值来指定事务的传播行为。

@Service
@Transactional
public class TransactionalService {@Autowiredprivate PlatformTransactionManager transactionManager;public void outerMethod() {// 在外部方法中执行一些操作innerMethod();}@Transactional(propagation = Propagation.REQUIRES_NEW)public void innerMethod() {// 在内部方法中执行一些需要独立事务的操作}
}

在上面的示例中,outerMethod方法使用默认的事务传播行为Propagation.REQUIRED,而innerMethod方法使用Propagation.REQUIRES_NEW,表示需要一个新的独立事务。如果outerMethod方法运行在一个已存在的事务中,那么innerMethod方法将会新建一个独立的嵌套事务。

注意,嵌套事务的实现是依赖于底层数据库的支持,例如MySQL InnoDB引擎支持嵌套事务,而MyISAM引擎不支持。因此,确保你使用的数据库引擎支持嵌套事务,并且你的事务管理器和数据库配置正确。

事务关闭

事务的关闭是指事务执行完毕或者发生异常时,需要显式地进行事务的提交或回滚操作,以确保事务的完整性和一致性。

在Spring框架中,事务的关闭可以通过事务管理器的方法来实现。

@Autowired
private PlatformTransactionManager transactionManager;public void rollbackTransaction() {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());try {// 在事务中执行操作transactionManager.commit(status); // 提交事务} catch (Exception e) {transactionManager.rollback(status); // 回滚事务}
}

需要注意的是,事务的关闭操作应该放在合适的地方,例如在业务方法的最后一步进行关闭。如果事务管理器配置了自动提交事务(@Transactional注解的autoCommit属性为true),则在方法结束时会自动进行事务的提交或回滚,无需手动关闭事务。

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

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

相关文章

A star算法

1. 算法的理解 1.2 a 星算法的基本的原理 a 星 是一种启发式搜索算法&#xff0c; 用于在地图中的两个目标点之间寻找最短的路径&#xff0c;它结合了最优先搜索和Dijkstra算法的特点&#xff0c;通过考虑从起点到当前点的距离&#xff08;或者代价 g&#xff08;n) ) 和估算…

筹码穿透率指标选股公式,衡量筹码抛压

在前面的文章中&#xff0c;介绍了博弈K线&#xff0c;它是根据筹码分布的原理结合普通K线的方法绘制出来的。当博弈K线的实体部分比较长的时候&#xff0c;说明当天穿越筹码密集区&#xff0c;有大量的筹码解套。通过引入换手率&#xff0c;可以衡量套牢盘的抛压程度。如果穿越…

unity 接收和发送Udp消息

因为需要用到unity和其他的程序交互&#xff0c;其他程序可以提供Udp消息&#xff0c;因此找了合适的相互连接方法。这里直接上代码。 工具类&#xff1a; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; u…

Xcode 最好用的 11 个快捷键

今天来分享一下我觉得很好用的 Xcode 12 个快捷键 1. Command Shift O 快速打开&#xff0c;可让你快速导航到项目中的任何文件、函数、变量 2. Command Shift J 快速定位到当前代码所在的文件夹位置&#xff0c;并切换到项目导航器中显示 3. Command Shift Y 快速…

2011年03月31日 Go生态洞察:Godoc —— Go代码的文档化

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Oracle数据库调优实战:优化SQL查询的黄金法则!

在数据库应用中&#xff0c;SQL查询是最常见且最频繁执行的操作之一。然而&#xff0c;当数据量庞大、查询复杂度高时&#xff0c;SQL查询性能可能变得低效。为了提高数据库的响应速度和吞吐量&#xff0c;我们需要进行SQL查询的优化。下面将介绍Oracle数据库调优的黄金法则&am…

微前端:quankun

零&#xff1a; 前言 微前端可以将大应用拆分功能独立的微应用&#xff0c;可独立开发部署&#xff0c; 每个微应用可以采用自己的技术栈&#xff0c;这样更好维护和拓展。微前端也会存在跨域 权限控制 数据共享 性能(页面加载时间) 安全 多团队协作(一个团队负责一个页面或模…

list部分接口模拟实现(c++)

List list简介list基本框架list构造函数list_node结构体的默认构造list类的默认构造 push_back()iteartor迭代器迭代器里面的其他接口const迭代器通过模板参数实现复用operator->() insert()erase()clear()析构函数迭代器区间构造拷贝构造operator() list简介 - list可以在…

【Java】本地开发环境正常、测试或生产环境获取的文件路径不对的问题

引 Java 中经常获取本地文件或者resource下的文件&#xff0c;要获取文件&#xff0c;首先要获得本地路径。 Java 本身或一些开源工具包都提供了很多获取路径的方法。但使用时经常遇到本地开发环境正常、测试或生产环境获取的文件路径不对的问题。 本文将列出几种常见的获取…

python开发过程中注意编码规范~

文章目录 一、 代码编排二、 文档编排三、 空格的使用四、 注释五、 文档描述六、 命名规范总体原则&#xff0c;新编代码必须按下面命名风格进行&#xff0c;现有库的编码尽量保持风格。七 编码建议关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、…

【三维重建】摄像机几何

针孔相机模型 为了方便我们对针孔相机模型进行数学建模&#xff0c;我们往往对虚拟像平面进行研究&#xff0c;因为虚拟像平面的方向与我们实际物体的方向一致。 通过相似三角形法可以得到三维坐标到二维坐标映射 将像平面原点坐标移动到左下角&#xff1a; 加上现实世界单位&a…

Vue中的$nextTick有什么作用?

一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM 什么意思呢&#xff1f; 我们可以理解成&#xff0c;Vue 在更新 DOM 时是异步执行的。当数据发生变化&#xff0c;Vue将开启一个异…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

【Linux笔记】Linux环境变量与地址空间

【Linux笔记】Linux环境变量与地址空间 一、命令行参数1.1、main函数的参数1.2、main函数的第三个参数 二、环境变量的概念与内容2.1、环境变量的概念2.2、环境变量的分类2.3、环境变量的组织形式2.4、常见的环境变量 三、设置环境变量3.1、通过命令获取或设置环境变量3.2、通过…

补偿 FIR 滤波器引入的延迟

补偿 FIR 滤波器引入的延迟 对信号进行滤波会引入延迟。这意味着相对于输入&#xff0c;输出信号在时间上有所偏移。此示例向您说明如何抵消这种影响。 有限冲激响应滤波器经常将所有频率分量延迟相同的时间量。这样&#xff0c;我们就很容易通过对信号进行时移处理来针对延迟…

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

目标检测算法 - YOLOv1

文章目录 1. 作者简介2. 目标检测综述3. YOLOv1算法3.1 预测阶段3.2 预测阶段后处理3.3 训练阶段 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。 YOLO是目标检测模型。目标检测是计算机视觉中比较简单的任务&#xff0c;用…

Pytorch实战教程(二十七)-基于ResNet模型实现猫狗分类

0. 前言 从 VGG11 到 VGG19,不同之处仅在于网络层数,一般来说,神经网络越深,它的准确率就越高。但并非仅增加网络层数,就可以获得更准确的结果,随着网络层数的增加可能会出现以下问题: 梯度消失和爆炸:在网络层次过深的情况下,反向传播可能会面临梯度消失和爆炸的问题…

OpenHarmony创新赛|赋能直播第五期

OpenHarmony创新赛赋能直播课程即将再次与大家见面&#xff01;本期基于之前的青蛙影院的UI界面设计的课程&#xff0c;介绍综合性APP的需求介绍和技术栈整合等内容。此外&#xff0c;课程同步赋能OpenHarmony创新赛&#xff0c;为参赛开发者带来新的思路和方法&#xff0c;也欢…

卷积神经网络中 6 种经典卷积操作

深度学习的模型大致可以分为两类&#xff0c;一类是卷积神经网络&#xff0c;另外一类循环神经网络&#xff0c;在计算机视觉领域应用最多的就是卷积神经网络&#xff08;CNN&#xff09;。CNN在图像分类、对象检测、语义分割等经典的视觉任务中表现出色&#xff0c;因此也早就…