Spring 事务支持

news2024/10/18 14:04:05

1、事务基础知识

1.1 事务4大特性-ACDI

ACDI 是一个缩写,通常用于描述数据库事务的四个基本特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

(1). 原子性(Atomicity)
定义:原子性是指事务是一个不可分割的最小工作单元,事务中的所有操作要么全部成功,要么全部失败回滚。
(2). 一致性(Consistency)
定义:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,即事务执行前后,数据库的完整性约束没有被破坏。
这些完整性约束包括实体完整性、域完整性、参照完整性、用户定义的完整性等。

  • 实体完整性:确保每个表的主键值必须是唯一的,且不允许为空。
  • 域完整性:确保列中的数据类型、范围和格式符合预定义的规则。
  • 参照完整性:确保外键值必须对应于另一个表中的主键值,或者为空。
  • 用户定义的完整性:确保用户自定义的业务规则得到遵守。

如何保证:

  • 数据库系统:数据库管理系统(DBMS)内置了一系列机制来确保这些完整性约束。例如,通过索引、约束、触发器等机制来强制执行这些规则。
  • 事务管理:数据库系统在事务提交前会检查所有完整性约束,如果发现任何违反约束的情况,事务将被回滚,确保数据库状态的一致性。

(3). 隔离性(Isolation)
定义:隔离性是指多个事务并发执行时,一个事务的执行不应影响其他事务的执行,每个事务都应该独立于其他事务。
(4). 持久性(Durability)
定义:持久性是指一旦事务提交,其对数据库的更改将永久保存,即使系统发生故障也不会丢失。

1.2 数据不一致问题

脏读、幻读和不可重复读是三种常见的数据不一致性问题。

(1). 脏读(Dirty Read)
定义:脏读是指一个事务读取了另一个事务未提交的数据。
示例:
事务 T1 插入了一条记录,但尚未提交。
事务 T2 读取了这条记录。
事务 T1 回滚,插入的记录被撤销。
事务 T2 读取到了一条实际上不存在的记录。
影响:事务 T2 读取到了不一致的数据,因为这条记录最终被回滚了。
(2). 不可重复读(Non-Repeatable Read)
定义:不可重复读是指在一个事务内多次读取同一数据,但由于其他事务的修改,导致读取结果不一致。
示例:
事务 T1 读取了一条记录 A。
事务 T2 修改了记录 A 并提交。
事务 T1 再次读取记录 A,发现数据已经改变。
影响:事务 T1 无法保证在同一个事务内读取到的数据是一致的。
(3). 幻读(Phantom Read)
定义:幻读是指在一个事务内多次执行同一查询,由于其他事务的插入或删除操作,导致查询结果集发生变化。
示例:
事务 T1 查询所有满足条件 X 的记录,得到结果集 R1。
事务 T2 插入了一条满足条件 X 的新记录并提交。
事务 T1 再次查询所有满足条件 X 的记录,得到结果集 R2,发现多了一条记录。
影响:事务 T1 无法保证在同一个事务内查询到的结果集是一致的。

1.2.1 解决方案

数据库通过不同的隔离级别来解决数据不一致的问题。

常见的隔离级别

  • 读未提交(Read Uncommitted):允许脏读、不可重复读和幻读。性能最好,但数据一致性最差。
  • 读已提交(Read Committed):防止脏读,但允许不可重复读和幻读。大多数数据库系统的默认隔离级别。
  • 可重复读(Repeatable Read)防止脏读和不可重复读,但允许幻读。MySQL InnoDB 存储引擎的默认隔离级别。
  • 序列化(Serializable):防止脏读、不可重复读和幻读。通过锁定整个表或使用多版本并发控制(MVCC)来实现。性能最差,但数据一致性最好。

2、spring 事务传播方式

  • REQUIRED:如果存在事务,则加入该事务;否则创建一个新的事务。
  • SUPPORTS:如果存在事务,则加入该事务;否则以非事务方式执行。
  • MANDATORY:如果存在事务,则加入该事务;否则抛出异常。
  • REQUIRES_NEW:创建一个新的事务,如果存在事务,则暂停当前事务。
    • 新事物与当前事物完全隔离,互不影响。
  • NOT_SUPPORTED:以非事务方式执行,如果存在事务,则暂停当前事务。
  • NEVER:以非事务方式执行,如果存在事务,则抛出异常。
  • NESTED:如果存在事务,则在嵌套事务内执行;否则创建一个新的事务。
    • 嵌套事务可以独立于外部事务进行提交或回滚。
    • 嵌套事务可以独立回滚,但外部事务的回滚会导致嵌套事务的回滚。

3、spring 事务隔离级别

spring对事物的管理,本质上是依赖数据库的,所以spring的事务隔离级别与数据库的是一致的。

多了一个default 默认级别,不同数据库的默认级别不同:

  • mysql:可重复读(Repeatable Read)
  • oracle:读已提交(Read Committed)
  • sql server:读已提交(Read Committed)

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

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

相关文章

Spring Boot 整合 RocketMQ 之顺序消息

前言: 上一篇我们分享了 Spring Boot 整合 RocketMQ 完成普通消息发送的过程,本篇我们来分享一下 RocketMQ 顺序消息的发送。 RocketMQ 系列文章传送门 RocketMQ 的介绍及核心概念讲解 Spring Boot 整合 RocketMQ 之普通消息 Spring Boot 整合 Rock…

大数据-178 Elasticsearch Query - Java API 索引操作 文档操作

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

芯片设计企业ERP软件如何选择更好

在芯片设计这一高科技领域,高效的企业管理成为推动创新与市场响应速度的关键。ERP(企业资源计划)软件作为企业管理的核心工具,其选择直接关系到企业的运营效率与竞争力。那么,芯片设计企业在面对琳琅满目的ERP软件时,如何做出更优…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

Axure横向菜单高级交互

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;横向菜单高级交互 主要内容&#xff1a;横向菜单左右拖动、选中效果 应用场景&#xff1a;app横向菜单、pc后台动态区域 案例展示&#xff1a; 演…

ThreadLocal源码详解

目录 Thread、ThreadLocalMap 、ThreadLocal关系 ThreadLocal中的get、Set方法 ThreadLocal 内存泄露问题 Thread、ThreadLocalMap 、ThreadLocal关系 从源码可以看出&#xff1a;Thread类中有成员变量ThreadLocalMap&#xff0c;ThreadLocalMap类中有成员变量Entry[]数组&a…

Spring Cache Caffeine 高性能缓存库

​ Caffeine 背景 Caffeine是一个高性能的Java缓存库&#xff0c;它基于Guava Cache进行了增强&#xff0c;提供了更加出色的缓存体验。Caffeine的主要特点包括&#xff1a; 高性能&#xff1a;Caffeine使用了Java 8最新的StampedLock乐观锁技术&#xff0c;极大地提高了缓存…

buffer/cache内存优化_posix_fadvise_主动释放读缓存cache

1.问题现象 1.htop free命令发现系统 buffer/cache 内存占用高 free -h total used free shared buff/cache available Mem: 61Gi 15Gi 569Mi 1.7Gi 45Gi 43Gi Swap: 30Gi 0.0Ki 30Gi cat /proc/meminfo or grep -E "Buff|Cache" /proc/meminfo Buffers: 370568 kB …

Linux 进程终止和进程等待

目录 0.前言 1. 进程终止 1.1 进程退出的场景 1.2 进程常见退出方法 1.2.1 正常退出 1.2.2 异常退出 2. 进程等待 2.1 进程等待的重要性 2.2 进程等待的方法 2.2.1 wait() 方法 2.2.2 waitpid() 方法 2.3 获取子进程 status 2.4 阻塞等待和非阻塞等待 2.4.1 阻塞等待 2.4.2 非阻…

拼三角问题

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 一题目&#xff1a; 二思路&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; 题目链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 二思路&#xff1a; 思路&#xff1a;首先明白能组成三角形…

php的echo和print输出语句⑥

在 PHP 中有两个基本的输出方式&#xff1a; echo 和 print。 echo 和 print 区别: echo : 可以输出一个或多个字符串 print : 只允许输出一个字符串。 提示&#xff1a;echo 输出的速度比 print 快&#xff0c; echo 没有返回值&#xff0c;print有返回值1。 <?php …

【赵渝强老师】Oracle的联机重做日志文件与数据写入过程

在Oracle数据库中&#xff0c;一个数据库可以有多个联机重做日志文件&#xff0c;它记录了数据库的变化。例如&#xff0c;当Oracle数据库产生异常时&#xff0c;导致对数据的改变没有及时写入到数据文件中。这时Oracle数据库就会根据联机重做日志文件中的信息来获得数据库的变…

Submariner 服务更新同步测试

测试服务更新同步问题 在集群1 部署 nginx1服务&#xff0c;导出服务&#xff0c;分配的虚拟 IP 为 100.1.255.253 在其他集群检测 serviceimport &#xff0c;可以检测到 nginx1 服务对应的 serviceimport 正常情况下的 serviceexport 如果删除 service 或者 删除 serviceexp…

OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面&#xff0c;通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…

闯关leetcode——112. Path Sum

大纲 题目地址内容 解题代码地址 题目 地址 https://github.com/f304646673/leetcode/tree/main/112-Path-Sum 内容 Given the root of a binary tree and an integer targetSum, return true if the tree has a root-to-leaf path such that adding up all the values alo…

OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::setTrackbarMin 这个函数的作用就是设置指定窗口中轨迹条的最小位置。这使得开发者能够在程序运行时动态地调整轨迹条的范围&#xff0c;而不…

基于STM32的风速风向传感器设计

引言 本项目设计了一个基于STM32的风速和风向传感器系统&#xff0c;能够通过组合使用旋转式风速传感器和电子罗盘&#xff0c;实时测量风速和风向&#xff0c;并将数据通过显示屏或无线模块发送给用户。该系统适用于气象监测、环境监控、农业自动化等场景&#xff0c;具有准确…

微信好友变顾客,7天成效的秘诀

在如今的社交媒体时代&#xff0c; 微信不仅是沟通工具&#xff0c;更是商业营销的重要平台。很多人拥有大量的微信好友&#xff0c;但成交的客户很少&#xff1f;以下四个有效的社交销售秘诀&#xff0c;帮助你在7天内实现转化。 01保持耐心&#xff0c;合理安排跟进时间 在销…

Springboot 整合 Java DL4J 实现安防监控系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

【网络安全】-vulnhub靶场-noob

1.靶机下载&#xff1a; https://www.vulnhub.com/entry/noob-1,746/ 得到ova文件导入虚拟机&#xff0c;并打开虚拟机设置&#xff0c;将靶机-Noob与攻击机-kali的网络适配器都改成NAT仅主机模式&#xff0c;确保两台虚拟机在同一网段上。 2.靶机-Noob ip 判断 命令&#x…