当前位置: 首页 > news >正文

【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制

【事务】开发中用到的事务,TransactionDefinition实例详解

    • 一、TransactionDefinition 介绍
      • 1、隔离级别(Isolation Level):
      • 2、传播行为(Propagation Behavior):
      • 3、超时设置(Timeout Setting):
      • 4、只读属性(Read-Only):
      • 5、名称(Name):
    • 三、@Transactional 应用
    • 二、TransactionDefinition 应用
    • 三、注意事项
    • 三、java其他常用的事务

一、TransactionDefinition 介绍

TransactionDefinition 是Spring框架中定义事务属性的接口。它提供了定义事务的各种属性和行为的方法,包括事务的隔离级别、传播行为、超时设置等。在Spring中,通过TransactionDefinition可以灵活地配置事务的行为,以满足不同业务场景的需求。

下面是TransactionDefinition接口中常用的属性和方法:

1、隔离级别(Isolation Level):

事务隔离级别常量 ISOLATION_DEFAULTISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_SERIALIZABLE 是 Java 中 TransactionDefinition 接口定义的隔离级别常量,用于表示事务的隔离级别。以下是这些隔离级别的具体含义:

  • ISOLATION_DEFAULT:

    表示使用数据库默认的隔离级别。具体隔离级别取决于数据库的配置和默认设置。

  • ISOLATION_READ_UNCOMMITTED:

    该隔离级别允许事务读取未提交的数据,也称为脏读(Dirty Read)。
    其他事务可以修改并提交数据,但是在当前事务读取时尚未提交的数据也可被读取。

  • ISOLATION_READ_COMMITTED:

    该隔离级别确保一个事务只能读取到已提交的数据,禁止脏读(Dirty Read)。
    当一个事务正在读取数据时,其他事务对该数据进行修改并提交,当前事务再次读取该数据时会获取到已提交的最新值。

  • ISOLATION_REPEATABLE_READ:

    该隔离级别确保一个事务在同一事务期间多次读取同一数据时,得到的结果是一致的,不会受其他事务的影响。
    即使其他事务对数据进行了修改并提交,当前事务多次读取同一数据时仍会获取到一致的结果,避免了不可重复读(Non-Repeatable Read)问题。

  • ISOLATION_SERIALIZABLE:

    该隔离级别是最高的隔离级别,确保所有事务按顺序串行执行,避免并发问题。
    当一个事务在执行时,其他事务无法对其涉及的数据进行修改和提交,直到当前事务完成。

这些隔离级别可以根据业务需求和数据库支持的情况来选择合适的级别。一般来说,隔离级别越高,数据一致性和安全性越高,但也可能会影响系统的并发性能。因此,在选择隔离级别时需要根据具体情况进行权衡和考虑。

2、传播行为(Propagation Behavior):

int getPropagationBehavior():获取事务的传播行为,可以是PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTED之一。

3、超时设置(Timeout Setting):

int getTimeout():获取事务的超时时间,以秒为单位。如果超过指定时间事务未完成,则会自动回滚。

4、只读属性(Read-Only):

boolean isReadOnly():判断事务是否为只读事务。只读事务不会对数据库进行写操作,可以提高性能。

5、名称(Name):

String getName():获取事务的名称,用于标识事务。
通过使用TransactionDefinition接口,可以在Spring中灵活地配置和管理事务的各种属性,从而实现对数据库操作的精确控制和优化。

三、@Transactional 应用

@Transactional 是 Spring 框架中用于声明事务性方法的注解之一。通过在方法上添加 @Transactional 注解,可以告诉 Spring 在执行该方法时要开启事务,并根据注解的配置来管理事务的提交、回滚等操作。

以下是 @Transactional 注解的一些常见用法和示例:

基本用法:在方法上添加 @Transactional 注解,表示该方法应该在事务管理范围内执行。

import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserDao userDao;@Transactionalpublic void updateUser(User user) {// 执行更新用户操作userDao.update(user);}
}

在上面的示例中,updateUser 方法被标记为 @Transactional,意味着当调用这个方法时,Spring 会自动为其开启一个事务。

事务属性配置:@Transactional 注解支持配置各种事务属性,例如事务的隔离级别、传播行为、超时设置等。

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, timeout = 30)
public void updateUser(User user) {// 执行更新用户操作userDao.update(user);
}

在这个示例中,@Transactional 注解配置了事务的隔离级别为 READ_COMMITTED,传播行为为 REQUIRED,超时时间为 30 秒。

异常回滚:默认情况下,@Transactional 注解会在方法抛出 RuntimeException 或其子类时回滚事务。你也可以通过 rollbackFor 属性指定需要回滚的异常类型。

@Transactional(rollbackFor = {SQLException.class, MyCustomException.class})
public void updateUser(User user) throws MyCustomException {// 执行更新用户操作userDao.update(user);if (somethingWentWrong) {throw new MyCustomException("Something went wrong!");}
}

在这个示例中,如果 updateUser 方法中出现 SQLExceptionMyCustomException 异常,事务会回滚。

总的来说,@Transactional 注解是 Spring 中用于声明事务性方法的便捷方式,通过注解配置可以灵活管理事务的行为和属性,使得事务管理更加方便和可控。

二、TransactionDefinition 应用

假设你正在开发一个基于Spring的Java项目,并且需要在其中使用TransactionDefinition来定义和管理事务属性。以下是一个示例代码,演示了如何在项目中使用TransactionDefinition:

首先,你需要在Spring的配置文件(如applicationContext.xml)中配置事务管理器和数据源:

<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="username"/><property name="password" value="password"/>
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>

接下来,假设你有一个Service层的类UserService,其中包含了一些对用户数据进行操作的方法,需要使用事务管理:

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;public class UserService {private PlatformTransactionManager transactionManager;public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public void updateUser(User user) {// 定义事务属性TransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {// 执行更新用户操作userDao.update(user);// 提交事务transactionManager.commit(status);} catch (Exception e) {// 发生异常时回滚事务transactionManager.rollback(status);throw new RuntimeException("更新用户失败", e);}}
}

在上面的示例中,UserService 类中的 updateUser 方法使用了 TransactionDefinition 来定义事务属性,包括事务的隔离级别、传播行为等。在方法中,首先获取事务管理器并使用事务定义开始事务,然后执行更新用户操作,最后根据操作结果提交或回滚事务。

在实际项目中,你可以根据具体业务需求和数据操作情况,灵活地配置和使用 TransactionDefinition来管理事务,保证数据操作的一致性和完整性。

三、注意事项

一定要注意!!!
spring 事务处理中,同一个类中:A方法(无事务)调B方法(有事务),事务不生效问题。

关注我,下周更新解决办法~

在使用事务时,有一些注意事项可以帮助你确保事务管理的正确性和可靠性:

  • 事务边界:确保事务的边界设置正确,即事务应该包含逻辑上相关的操作,并且不应该跨越多个业务逻辑边界。
  • 事务管理位置:在合适的位置使用事务管理,通常是在 Service 层业务逻辑层进行事务管理,而不是在控制器(Controller)层或DAO层。
  • 事务传播行为:根据业务需求和操作的情况,选择适当的事务传播行为。例如,如果一个方法调用另一个带有事务的方法,可以使用 Propagation.REQUIRED 传播行为。
  • 事务隔离级别:根据业务的并发访问情况和数据一致性要求,选择合适的事务隔离级别。常用的隔离级别包括 Isolation.READ_COMMITTED 和 Isolation.REPEATABLE_READ 等。
  • 异常处理:在事务中对异常进行处理,确保发生异常时事务可以正确回滚。可以使用 rollbackFor
    属性指定需要回滚的异常类型,或者在方法中捕获异常并手动回滚事务。
  • 事务超时:根据业务操作的耗时情况,设置适当的事务超时时间,避免事务长时间持有数据库连接。
  • 只读事务:对于只读操作,使用 @Transactional(readOnly = true) 注解来声明只读事务,可以提高性能。
  • 避免长事务:尽量避免长时间持有事务,以减少数据库锁定时间和资源占用。
  • 并发控制:对于需要并发控制的操作,使用乐观锁或悲观锁等技术来确保数据一致性。
  • 事务测试:在开发过程中进行事务的单元测试,验证事务管理的正确性和可靠性。

三、java其他常用的事务

在Java开发中,事务是管理数据库操作的重要概念之一。以下是在Java开发中常用的事务相关技术和工具:

  • Java Transaction API (JTA):

    JTA 是 Java 平台的事务管理 API,用于管理分布式事务。它提供了 UserTransaction 接口来控制事务的开始、提交和回滚操作。

  • Java Persistence API (JPA):

    JPA 是一种用于对象持久化的Java标准。它可以与 JTA 结合使用,通过注解或 XML 配置来管理实体类的持久化操作,包括事务管理。

  • Spring Framework:

    Spring 框架提供了广泛的事务管理支持。通过 Spring 的声明式事务管理(Declarative Transaction Management)或编程式事务管理(Programmatic Transaction Management),可以很方便地管理事务。

  • Java Database Connectivity (JDBC):

    JDBC 是 Java 提供的用于与数据库交互的标准 API。它可以通过设置事务隔离级别和使用 Connection 对象的 commit()、rollback() 方法来实现事务管理。

  • Spring Data JPA:

    Spring Data JPA 是 Spring 框架的一个模块,提供了对 JPA 的更高级别的抽象和简化。它可以与 Spring 的事务管理结合使用,简化数据访问层的开发,并自动处理事务。

  • Hibernate:

    Hibernate 是一个流行的 ORM 框架,它可以与 JTA 或 Spring
    的事务管理结合使用,实现对数据库操作的事务管理和持久化。

  • Atomikos:

    Atomikos 是一个分布式事务管理器,可以用于管理跨多个数据库或系统的事务。它提供了可靠的事务管理和故障恢复机制。

这些技术和工具可以根据具体的项目需求和开发环境选择和组合使用,以实现有效的事务管理和数据库操作。

相关文章:

【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制

【事务】开发中用到的事务&#xff0c;TransactionDefinition实例详解 一、TransactionDefinition 介绍1、隔离级别&#xff08;Isolation Level&#xff09;&#xff1a;2、传播行为&#xff08;Propagation Behavior&#xff09;&#xff1a;3、超时设置&#xff08;Timeout …...

Linux信号处理

Linux信号处理 什么是linux信号 本质是一种通知机制&#xff0c;用户 or 操作系统通过发送一定的信号&#xff0c;通知进程&#xff0c;某些事情已经发生&#xff0c;你可以在后续进行处理。 信号产生是随机的&#xff0c;进程可能正在忙自己的事情&#xff0c;所以&#xf…...

nuclei使用方法

nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板&#xff0c;wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…...

【并查集专题】【蓝桥杯备考训练】:网络分析、奶酪、合并集合、连通块中点的数量、格子游戏【已更新完成】

目录 1、网络分析&#xff08;第十一届蓝桥杯省赛第一场C A组/B组&#xff09; 2、奶酪&#xff08;NOIP2017提高组&#xff09; 3、合并集合&#xff08;模板&#xff09; 4、连通块中点的数量&#xff08;模板&#xff09; 5、格子游戏&#xff08;《信息学奥赛一本通》…...

数据结构(三)复杂度的深层次剖析

之前发布了数据结构&#xff08;一&#xff09;&#xff0c;很多同学反响不够清晰&#xff0c;那今天就发一篇对复杂度专题的博客&#xff0c;希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度&#xff0c;二分查找的复杂度&#xff08;之前写过二…...

JavaWeb -- HTTP -- WEB服务器TOMCAT

一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…...

GitHub与Git命令使用笔记

GitHub与Git命令使用笔记 文章目录 GitHub与Git命令使用笔记上传本地的新项目到github1. 创建新的GitHub仓库2. 初始化本地项目目录3. 将本地仓库关联到GitHub4. 推送本地代码到GitHub上传本地项目到GitHub时发生冲突 将默认分支名称从master改为maingit 把远程项目拉到本地&am…...

二叉树的层次遍历经典问题-算法通关村

二叉树的层次遍历经典问题-算法通关村 1 层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题。广度优先又叫层次遍历&#xff0c;基本过程如下&#xff1a; 层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后…...

SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十一&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 48、sqlite3_stmt_isexplain sqlite3_stmt_is…...

大模型时代如何做安全?

现在应该没人怀疑AI时代的到来了吧&#xff0c;在HUB上每天100的新的预训练模型产生&#xff0c;不夸张的说的&#xff0c;现在稍微有点计算机基础的人都可以训练自己的模型了。 说远了&#xff0c;还是说说那些不争气的安全厂商吧。为啥只说安全厂商&#xff1f;因为国内还是…...

新型储能是什么,储能系统解决方案现状及趋势详细说明

新型储能是指新兴的能够存储电能并在需要时释放的储能技术。其中主要包括光伏储能和商业储能。 光伏储能是指通过光伏电池将太阳能转化为电能&#xff0c;并将其存储起来以供后续使用。光伏储能系统一般由太阳能电池板、储能装置和逆变器组成。光伏储能可以将白天产生的电能存…...

掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)

在Go语言中&#xff0c;字典通常指的是map类型&#xff0c;它是一种用于存储键值对的数据结构。字典在Go中非常常见&#xff0c;是一种高效的数据结构&#xff0c;用于快速查找和检索数据。 字典的详细使用方法 创建字典 可以使用make函数来创建字典&#xff0c;并指定键值对…...

Flutter-仿携程首页类型切换

效果 唠叨 闲来无事&#xff0c;不小心下载了携程app&#xff0c;还幻想可以去旅游一番&#xff0c;奈何自己运气不好&#xff0c;自从高考时第一次吹空调导致自己拉肚子考试&#xff0c;物理&#xff0c;数学考了一半就交卷&#xff0c;英语2B铅笔除了问题&#xff0c;导致原…...

C语言 自定义类型:结构体

目录 前言 一、结构体类型 1.1 结构体的声明 1.2 结构体变量的创建和初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 二、结构体的对齐 2.1 对齐规则 2.2 内存对齐的原因 2.3 修改默认对齐数 2.4 结构体传参 三、结构体实现位段 3.1 位段的内存分配 3.2 段的跨平…...

计算机网络拓扑结构

目录 <网络拓扑结构概念> <典型的拓扑结构介绍> 第一种&#xff0c;总线型网络拓扑结构 第二种&#xff0c;星型网络拓扑结构 第三种&#xff0c;树型网络拓扑结构 第四种&#xff0c;环型网络拓扑结构 第五种&#xff0c;网状型网络拓扑结构 第六种&#…...

FPGA通过I2C控制AT24C64

文章目录 前言一、代码设计框图二、IIC_drive模块设计2.1、模块接口&#xff1a;2.2、代码功能描述&#xff1a;2.3、IIC协议实现过程&#xff1a; 三、EEPROM_ctrl模块设计3.1、模块接口&#xff1a;3.2、代码功能描述 四、EEPROM_drive模块五、iic_top模块 前言 继上一篇FPG…...

134. 加油站(力扣LeetCode)

文章目录 134. 加油站题目描述暴力枚举&#xff08;超时&#xff09;代码一代码二&#xff08;优化&#xff09; 贪心算法方法一方法二 134. 加油站 题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&…...

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日&#xff0c;主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业&#xff0c;星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时&#xff0c;星辰天合先…...

数据挖掘与分析学习笔记

一、Numpy NumPy&#xff08;Numerical Python&#xff09;是一种开源的Python库&#xff0c;专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一&#xff0c;因为它高效地实现了向量化计算&#xff0c;并提供了对大型多维数组和矩阵的支持…...

linux docker镜像初始化

linux docker镜像初始化 简介 有的镜像内部使用的linux系统特别精简&#xff0c;许多常用命令无法安装&#xff0c;导致排查问题较为困难。 可以使用cat /etc/os-release查看容器使用的linux版本&#xff0c;再进行一些常用操作的初始化。 Debian # 设置镜像源 RUN rm -f /…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…...

Angular中Webpack与ngx-build-plus 浅学

Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具&#xff0c;用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中&#xff0c;Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…...