java事务相关知识小总结

java事务相关知识小总结

Spring 事务相关知识:

Spring提供了强大的事务管理机制,支持声明式事务和编程式事务。以下是一些与Spring事务相关的关键知识点:

声明式事务管理:

  • 使用 @Transactional 注解声明事务,可以应用在类级别或方法级别。

  • 提供了一系列的属性,如 propagation(传播行为)、isolation(隔离级别)、readOnly(只读事务)、timeout(超时设置)等。

@Service
@Transactional
public class MyService {// ...
}

编程式事务管理:

  • 使用 TransactionTemplatePlatformTransactionManager 进行编程式事务管理。

@Service
public class MyService {
​private final PlatformTransactionManager transactionManager;
​@Autowiredpublic MyService(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}
​public void programmaticTransaction() {TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);transactionTemplate.execute(status -> {// your transactional codereturn null;});}
}

事务传播行为:

Spring 提供了多种事务传播行为,常用的包括:

  • REQUIRED(默认):

    • 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

  • REQUIRES_NEW:

    • 总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。

  • NESTED:

    • 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则行为类似于 REQUIRED

  • SUPPORTS:

    • 支持当前事务,如果没有当前事务,则以非事务方式执行。

  • NOT_SUPPORTED:

    • 以非事务方式执行,如果当前存在事务,则将其挂起。

  • NEVER:

    • 以非事务方式执行,如果当前存在事务,则抛出异常。

  • MANDATORY:

    • 强制要求存在一个事务,如果没有,则抛出异常。

  • NEVER:

    • 总是以非事务方式执行,如果当前存在事务,则抛出异常。

事务隔离级别:

  • DEFAULT:

    • 使用数据库默认的隔离级别。

  • READ_UNCOMMITTED:

    • 允许脏读、不可重复读、幻读。

  • READ_COMMITTED:

    • 禁止脏读,但允许不可重复读、幻读。

  • REPEATABLE_READ:

    • 禁止脏读、不可重复读,但允许幻读。

  • SERIALIZABLE:

    • 禁止脏读、不可重复读、幻读。

事务的失效条件:

事务的失效是指在一些情况下,尽管使用了事务管理机制,但事务并未按照期望的方式工作。以下是一些可能导致事务失效的常见原因:

  1. 未捕获的异常:

    • 如果在事务中的代码块中抛出未捕获的异常,并且这个异常不是继承自 RuntimeException,Spring 的事务管理机制可能无法感知到异常,从而导致事务无法回滚。

  2. 自调用问题:

    • 在同一类中,使用 this 关键字进行方法调用时,事务失效,因为默认是通过代理对象来增强事务的。

    @Service
    @Transactional
    public class MyService {
    ​public void outerMethod() {innerMethod(); // 调用自己类中的方法}
    ​public void innerMethod() {// ...}
    }

  3. 不在公共方法上使用事务注解:

    • 如果在非公共方法上使用 @Transactional 注解,事务也会失效,因为Spring AOP 默认只拦截公共方法。

    @Service
    public class MyService {
    ​@Transactionalpublic void publicMethod() {// ...}
    ​@Transactionalprivate void privateMethod() {// 不会生效}
    }

  4. 事务的配置问题:

    • 检查事务的配置,如传播行为、隔离级别等,确保其符合业务需求。

  5. 数据库引擎不支持事务:

    • 确保数据库引擎支持事务,以及相关表的存储引擎是否支持事务。

在使用事务时,需要仔细检查代码和配置,确保事务的正确性。阅读日志和检查异常信息有助于识别和解决事务失效的问题。

MySQL 事务的相关知识:

MySQL 是一种支持事务的关系型数据库管理系统(RDBMS)。以下是一些关于 MySQL 事务的基本知识:

事务的四个特性(ACID):

  • 原子性(Atomicity): 事务中的所有操作要么全部执行成功,要么全部失败回滚。

  • 一致性(Consistency): 事务执行后,数据库从一个一致性状态转移到另一个一致性状态。

  • 隔离性(Isolation): 多个事务同时执行时,一个事务的执行不应影响其他事务。

  • 持久性(Durability): 一旦事务提交,其结果应该在数据库中持久存在,即使系统故障。

事务的隔离级别:

  • MySQL 支持多种隔离级别,包括读未提交(READ UNCOMMITTED)、读提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。

事务的开始和提交:

  • 使用 START TRANSACTIONBEGIN 开始事务,使用 COMMIT 提交事务。也可以使用 ROLLBACK 进行事务回滚。

START TRANSACTION;
-- or BEGIN;
-- your SQL statements
COMMIT;
-- or ROLLBACK;

事务的自动提交:

  • 默认情况下,MySQL 是自动提交事务的,每个 SQL 语句都被视为一个事务。可以使用 SET AUTOCOMMIT = 0 关闭自动提交,然后使用 COMMITROLLBACK 手动管理事务。

SET AUTOCOMMIT = 0;
-- your SQL statements
COMMIT;
-- or ROLLBACK;

MySQL 事务的失效条件:

MySQL 事务的失效条件可能包括以下情况:

  1. 隔离级别问题:

    • 在较低的隔离级别下,可能发生脏读、不可重复读或幻读。选择合适的隔离级别,根据业务需求来平衡一致性和性能。

  2. 死锁:

    • 多个事务相互等待对方释放锁,导致所有事务都无法继续执行。

  3. 锁超时:

    • 如果事务持有锁的时间过长,可能会导致其他事务因为等待超时而失败。

  4. 事务太大:

    • 如果一个事务包含大量的数据修改,可能会导致锁定太多的资源,影响其他事务的执行。

  5. 并发性问题:

    • 当大量并发事务同时访问数据库时,可能会出现性能问题,需要适当调整事务隔离级别和优化 SQL 查询。

  6. 数据库故障:

    • 数据库的故障可能导致事务无法正常提交,需要合适的异常处理和重试机制。

Redis 事务的相关知识:

在 Redis 中,事务是通过 MULTIEXECDISCARDWATCH 等命令实现的。

  1. MULTI: 开始一个事务,之后的命令都将被放入队列而不会立即执行。

  2. EXEC: 执行所有在 MULTI 开始和 EXEC 结束之间的命令。

  3. DISCARD: 取消事务,清空所有在 MULTI 开始和 DISCARD 结束之间的命令。

  4. WATCH: 监视一个或多个键,当这些键被其他客户端修改时,事务将被取消。

事务的基本使用示例:

MULTI
SET key1 "value1"
GET key1
INCR key2
EXEC

以上命令会将 SETGETINCR 三个命令作为一个事务进行处理。

Redis 事务的失效条件:

在 Redis 中,虽然有事务的概念,但 Redis 事务并不支持像关系型数据库那样的 ACID 特性。以下是一些 Redis 事务可能失效的情况:

  1. WATCH 机制的限制:

    • Redis 使用 WATCH 命令来实现乐观锁,但 WATCH 只能监视字符串类型的键,不能监视集合或哈希表。

  2. 命令执行失败:

    • 如果在 MULTI 和 EXEC 之间有命令执行失败,整个事务都不会回滚。Redis 事务并不具备回滚的能力。

  3. 命令语法错误:

    • 如果在事务中存在语法错误的命令,整个事务将中断,后续命令不会执行。

  4. 执行命令失败:

    • 如果在 EXEC 执行时,其中一个命令执行失败(比如对字符串类型执行了非字符串类型的命令),整个事务将中断。

  5. 网络问题:

    • 在 EXEC 执行之前,如果与 Redis 服务器的连接断开,事务也会中断。

  6. WATCH 的 CAS 版本冲突:

    • 如果使用 WATCH 监控了某个键,但在执行 EXEC 时发现键的 CAS 版本已经发生了变化,事务也会中断。

需要注意的是,Redis 事务并不提供回滚的能力,而是执行到出错的那一步,之后的命令不再执行。因此,在使用 Redis 事务时,需要谨慎考虑其适用场景和特性。如果需要严格的事务控制,可能需要考虑其他数据库方案。

MyBatis 事务的相关知识:

MyBatis 是一个持久层框架,它允许开发者使用简单的 XML 或注解配置来映射原生信息,将 Java 对象映射到数据库表中。MyBatis 不直接处理事务,而是依赖于底层的数据库事务。

事务配置:

  • 在 MyBatis 中,事务的管理通常交由底层的数据库连接池(如 Druid、HikariCP)来处理。MyBatis 不提供自己的事务管理器,而是通过配置数据源和使用 JDBC 事务。

<!-- MyBatis 配置文件 -->
<configuration><!-- 数据源配置 --><dataSource type="POOLED"><!-- 配置数据源相关信息 --></dataSource>
</configuration>

事务控制:

  • 在 MyBatis 中,可以使用 @Transactional 注解来声明事务。这个注解可以在类级别或方法级别使用。

@Service
@Transactional
public class MyService {// ...
}
javaCopy code@Mapper
public interface MyMapper {@Transactionalvoid myMethod();
}

手动提交和回滚:

  • MyBatis 默认是开启自动提交的,如果需要手动控制事务,可以在 SqlSession 中使用 commit()rollback() 方法。

SqlSession sqlSession = sqlSessionFactory.openSession();
try {// your codesqlSession.commit(); // 提交事务
} catch (Exception e) {sqlSession.rollback(); // 回滚事务
} finally {sqlSession.close();
}

MyBatis 事务的失效条件:

MyBatis 事务失效可能与底层数据库事务相关,常见的失效条件包括:

  1. 异常未捕获:

    • 如果在事务中的代码块中抛出未捕获的异常,事务可能会失效。确保在事务代码块中适当地捕获和处理异常。

  2. 未设置自动提交:

    • 默认情况下,MyBatis 是开启自动提交的。如果手动设置了 autoCommitfalse,但没有手动提交事务,可能会导致事务失效。

    sqlSession.getConnection().setAutoCommit(false);

  3. 手动提交后的继续执行:

    • 如果在手动提交事务后继续执行其他 SQL 语句,可能会导致事务失效。确保在提交事务后不再执行其他需要事务保护的操作。

    sqlSession.commit();
    // 继续执行其他 SQL 语句
  4. 并发控制问题:

    • MyBatis 默认是不处理并发控制的,如果有多个线程同时修改同一行数据,可能会出现并发问题。在需要并发控制的场景,可以考虑使用数据库提供的锁机制或乐观锁。

确保了解 MyBatis 事务的底层机制,并在代码中正确地使用事务管理,可以避免事务失效的问题。在处理异常和提交事务时,要特别注意保持事务的一致性。

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

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

相关文章

Java开发四则运算-使用递归和解释器模式

使用递归和解释器模式 程序结构设计具体实现1. 先上最重要的实现类&#xff1a;ExpressionParser&#xff08;最重要&#xff09;2. 再上上下文测试代码&#xff1a;Context&#xff08;程序入口&#xff0c;稍重要&#xff09;3. 使用到的接口和数据结构&#xff08;不太重要的…

C++类和对象(3)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任…

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…

C++ easyx 结合C++实现 画同心圆。

easyx 结合C实现 画同心圆。 #include<graphics.h> #include<conio.h>int main() {initgraph(666, 666); // 初始化为 666*666 的画布/* circle */setcolor(BLUE); //circle 的线条为某色setfillcolor(YELLOW); //circle 内某色填充 setlinestyle(PS_…

windows11安装docker for windows一直报错的记录

电脑windows11 安装docker&#xff0c;启用wsl2&#xff0c;这块网上搜搜 参考 旧版 WSL 的手动安装步骤 其他都没有问题&#xff0c;通过wsl2访问 Ubuntu22.04 也没有问题 问题是docker 安装需要执行 wsl --update 一直报错&#xff1a;请在存储设置中,将系统驱动器设置为新内…

LeetCode每日一题 | 1686. 石子游戏 VI

文章目录 题目描述问题分析程序代码 题目描述 原题链接 Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有n个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双…

基于 Echarts 的 Python 图表库:Pyecahrts交互式的日历图和3D柱状图

文章目录 概述一、日历图和柱状图介绍1. 日历图基本概述2. 日历图使用场景3. 柱状图基本概述4. 柱状图使用场景 二、代码实例1. Pyecharts绘制日历图2. Pyecharts绘制2D柱状图3. Pyecharts绘制3D柱状图 总结 概述 本文将引领读者深入了解数据可视化领域中的两个强大工具&#…

关于VxTerm有可能通过SSH协议默认情况下不能正常连接华为S5735交换机的解决办法

此方法为网友&#xff1a;刘春&#xff08;QQ282867758&#xff09;多次测试后找到的解决办法。 在此感谢他&#xff01;谢谢&#xff01; 默认情况下&#xff0c;VxTerm与S5735建立SSH连接时采用的Kex Exchange算法为&#xff1a;diffie-hellman-group-exchange-sha256&…

Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输 1.1 服务端 fastapi_server.py 编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。 #!/usr/bin/env python # codingutf-8 # Time : 2024/1/31 19:13 # Software: PyCharm from fastapi import FastAPI from fa…

大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述

上一篇文章&#xff1a; 大数据 - Hadoop系列《三》- HDFS&#xff08;分布式文件系统&#xff09;概述-CSDN博客 目录 12.1 针对MapReduce的设计构思 1. 如何对付大数据处理场景 2. 构建抽象编程模型 3. 统一架构、隐藏底层细节 12.2 分布式计算概念 12.3 MapReduce定义…

如何通过CVE漏洞编码找到对应的CVE漏洞详情及源码修改地址

背景&#xff1a; 最近正在使用docker进行一些cve漏洞的复现&#xff0c;有时候就要通过CVE的漏洞编码&#xff0c;找到对应的漏洞详情&#xff0c;以及漏洞的源码修改 以我上一篇文章的CVE-2020-17518编码为例 Apache Flink文件上Apache Flink文件上 方法&#xff1a; 通…

为什么golang不支持可重入锁呢?

为什么golang不需要可重入锁&#xff1f; 在工程中使用锁的原因在于为了保护不变量&#xff0c;也可以用于保护内、外部的不变量。 基于此&#xff0c;Go 在互斥锁设计上会遵守这几个原则。如下&#xff1a; 在调用 mutex.Lock 方法时&#xff0c;要保证这些变量的不变性保持…

手写分布式存储系统v0.2版本

引言 上回说到 手写分布式存储系统v0.1版本 &#xff0c;已经实现了通过监听TCP端口并将数据写到本地磁盘的功能&#xff0c;今天咱们就继续往上面添砖加瓦 v0.2版本大致做以下功能 实现滚动写文件 代码优化 一、滚动写文件实现 由于咱们写文件是用的mmap进行文件写入&am…

索引的设计原则(MySQL)

文章目录 文章目录 前言 一、搜索的索引列 二、使用唯一索引 三、使用短索引 四、最左前缀原则 五、不要过度使用 六、尽量使用主键索引 ​​​​​ 前言 索引的设计需要遵循一些原则&#xff0c;创建索引时遵循这些原则&#xff0c;有利于提升查询效率。 一、搜索的索引列 创建…

解决ModuleNotFoundError: No module named ‘pysqlite2‘

目录 一、问题描述 二、问题分析 三、解决方法 四、参考文章 一、问题描述&#xff1a; 新建conda编译环境。安装Jupyter后打不开&#xff0c;报错&#xff1a; 二、问题分析&#xff1a; 缺少sqlite3动态链接库 三、解决方法&#xff1a; SQLite Download Page 下载…

组播目的地址

路由器收到目的地址为224.0.0.5和239.0.0.5的组播报文如何处理? 224.0.0.5为永久组地址,是IANA为路由协议预留的IP地址(也称为保留组地址),用于标识一组特定的网络设备,供路由协议,目前被分配于OSPF协议使用,运行了OSPF协议的网络设备默认都会加入该组播组。 当路由器…

数字地球开放平台农作物长势监测解决方案

利用遥感技术进行产量预测是一种高效而准确的方法&#xff0c;通过监测植被的生长状况、土地利用、气象等因素&#xff0c;可以为农业决策提供有力支持。数字地球开放平台拥有200颗卫星&#xff0c;为您提供一站式卫星遥感服务。 数字地球开放平台将为您介绍一般遥感技术在农作…

游戏开发丨基于Panda3D的迷宫小球游戏

文章目录 写在前面Panda3D程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于panda3d的迷宫中的小球游戏 所需环境 pythonpycharm或anacondapanda3d 下载地址 https://download.csdn.net/download/m0_68111267/88792121 Panda3D Panda3D是一种开放源代码…

如何选择最适合的服务器

许多朋友想做一些网站&#xff0c;应用&#xff0c;游戏&#xff0c;小程序等等&#xff0c;都需要接触一个基础&#xff0c;就是服务器。服务器相当于一台24小时不关机的联网电脑&#xff0c;浏览网页或者应用相当于用户在访问这台电脑里的文件。那么如何选择最适合自己的服务…

在微服务项目中,实现无停机更新有哪些方法和策略?

在微服务项目中&#xff0c;确保线上更新不停掉服务是非常关键的&#xff0c;以保障系统的可用性。以下是一些方法和策略&#xff0c;可以帮助实现无停机更新&#xff1a; 蓝绿部署&#xff08;Blue-Green Deployment&#xff09;&#xff1a; 在蓝绿部署中&#xff0c;维护两个…