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

事务传播特性和隔离级别

 事务的四大特性

1.原子性(Atomicity):事务不可再分,要么都执行,要么都不执行。
2.一致性(Consistency):事务执行前后,数据的完整性保持一致,即修改前后数据总量是一样的大概。
3.隔离性(Isolation):一个事务执行过程中,不会受到其他事务干扰。
4.持久性(Durability):事务一旦结束,对数据库的影响是永久的。数据持久化到数据库中。在并行程序中可能会出现的问题

脏读:当 A事务 读取 B事务 未提交的数据后,B事务 回滚,导致 A事务 读取到的数据为脏数据。
不可重复读:A事务 读取第一次读取数据后,B事务 对该数据进行了修改并提交,A事务 再去读取数据时,前后数据结果不一致。
幻读:A事务 读取第一次读取数据后,B事务 又插入或删除了新的数据并提交,A事务 再去读取数据时,前后结果不一致。
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如 SQL、C++ 或 Java)书写的用户程序的执行所引起,并用形如 begin transaction 和 end transaction 语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。例如:在关系数据库中,一个事务可以是一条 SQL 语句,一组 SQL 语句或整个程序。

事务隔离级别定义了在一个事务中,哪些数据是对当前执行的语句“可见”的。在并发访问数据库时,事务隔离级别定义了多个事务之间对于同个目标数据源访问时的可交叉程度。
可交叉程度

1.Dirty Read(脏读) 看到的数据则是不正确的

当一个事务能看见另外一个事务未提交的数据时,就称为脏读。如果这个事务被回滚而不是提交了,那么其它事务看到的数据则是不正确的,是“脏”的。

 

2.Non-repeatable Read(不可重复读) 两次读取到的数据不同

假设事务 A 读取了一行数据,接下来事务 B 改变了这行数据,之后事务 A 再一次读取该行数据,结果就是事务 A 两次读取到的数据不同。

3.Phantom Read(幻读) 发现多出来一条数据

假设事务 A 通过一个 where 条件读取到了一个结果集,此时事务 B 插入了一条符合事务 A 的 where 条件的数据,之后事务 A 再次执行同样的查询时,发现多出来一条数据。

 

三、事务隔离级别(Isolation)
JDBC 规范增加了隔离级别,来满足了 SQL:2003 定义的 4 种事务隔离级别。在安装MySQL时,安装默认的隔离级别就是:可重复读。来查看当前隔离级别。隔离级别从最宽松到最严格,排序如下所示:

1.TRANSACTION_NONE
这意味着当前的 JDBC 驱动不支持事务,也意味着这个驱动不符合 JDBC 规范。

2.READ_UNCOMMITTED(读未提交)
允许事务看到其它事务修改了但未提交的数据,这意味着有可能是脏读、不可重复读或者幻读。

3.READ_COMMITTED(读提交)
一个事务在未提交之前,所做的修改不会被其它事务所看见。这能避免脏读,但避免不了不可重复读和幻读。

4.REPEATABLE_READ(可重复读取) MySQL默认的事务隔离级别
避免了脏读和不可重复读,但幻读依然是有可能发生的。

5.SERIALIZABLE(序列化)
避免了脏读、不可重复读以及幻读。

四、Propagation:用来枚举事务的传播行为
所谓事务的传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring 支持 7 种事务传播行为,默认为 REQUIRED。

1.REQUIRED
@Transactional(propagation=Propagation.REQUIRED)
如果当前有事务,加入到这个事务中。如果当前没有事务,就新建一个事务。

2.REQUIRES_NEW
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务。表示当前方法必须运行在它自己的事务中。如果使用 JTATransactionManager 的话,则需要访问 TransactionManager。

3.MANDATORY
@Transactional(propagation=Propagation.MANDATORY)
表示该方法必须在事务中运行,如果当前不存在事务,则会抛出一个异常。不会主动开启一个事务。

4.NEVER
@Transactional(propagation=Propagation.NEVER)
表示该方法不应该运行在事务上下文中,如果当前正有一个事务在运行,则会抛出异常。(与Propagation.MANDATORY相反)。

5.SUPPORTS
@Transactional(propagation=Propagation.SUPPORTS)
表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么这个方法会在这个事务中运行。

6.NOT_SUPPORTED
@Transactional(propagation=Propagation.NOT_SUPPORTED)
表示该方法不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用 JTATransactionManager 的话,则需要访问 TransactionManager。

7.NESTED
@Transactional(propagation=Propagation.NESTED)
表示如果当前已经存在事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前不存在事务,那么其行为等价于 Propagation.REQUIRED。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

综上所述,NESTED 和 REQUIRES_NEW 非常相似,都是开启一个属于它自己的新事务。使用 REQUIRES_NEW 时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。当内部事务开始执行时, 外部事务将被挂起,内务事务结束时,外部事务将继续执行。两个事务互不影响,两个事务不是一个真正的嵌套事务,同时它还需要 JTA 事务管理器的支持。

使用 NESTED 时,外层事务的回滚可以引起内层事务的回滚,而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。嵌套事务开始执行时,它将取得一个 savepoint,如果这个嵌套事务失败,将回滚到此 savepoint。嵌套事务是外部事务的一部分,只有外部事务结束后它才会被提交。
 

 

 

相关文章:

事务传播特性和隔离级别

事务的四大特性 1.原子性(Atomicity):事务不可再分,要么都执行,要么都不执行。 2.一致性(Consistency):事务执行前后,数据的完整性保持一致,即修改前后数据总…...

socket网络编程

端口 :主机上一个应用程序的代号(端口不变) 为什么不用PID来表示一个应用 因为PID会变化,而端口是不变的 套接字进程间通信——跨越主机 1、主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序,不同…...

IO多路复用机制详解

高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blo…...

选择一款好用的营销项目管理可以更好帮您解决任何问题

营销项目管理软件哪个好用?使用Zoho Projects营销项目管理软件,您可以从营销活动中获得最佳结果,并获得可执行的见解。Zoho Projects的营销项目管理软件可让您和您的团队全面了解您的所有活动。监控您的社交渠道、跟踪结果并在一处进行交流。…...

计算机网络(第八版)第三章知识总结(期末复习可用)

本笔记来源于博主上课所记笔记整理,可能不全,欢迎大家批评指正,如果觉得有用记得点个赞,给博主点个关注...该笔记将会持续更新...整理不易,希望大家多多点赞。 第一章 第三章 数据链路层 数据链路层属于计算机网络的低…...

VScode配置8086汇编环境

目录 0、感慨 1、VScode的安装 2、下载MASM/TASM插件 3、测试汇编环境 新建文件 汇编文件配置 汇编代码的运行 0、感慨 搭配一个简单些的环境,对于我们汇编的学习很有帮助,在这里又不得不感叹vscode的强大,使用VScodeMASM/TASM插件就…...

银行数字化转型导师坚鹏:银行同业核心产品与营销策略解读

数字化背景下银行同业核心产品与营销策略解读课程背景: 数字化背景下,很多银行存在以下问题:不清楚银行同业核心产品发展现状?不清楚如何银行同业产品营销策略?不知道如何更好地挖掘他行优质客户? 课…...

在线答题考试小程序源码系统 支持在线刷题+考试二合一+安装部署教程

分享一个在线答题考试小程序源码系统,支持在线刷题考试二合一,程序包含前后端和详细的安装部署教程,可以用来给学生刷题,给员工刷题,给政企员工刷题,万能通用版适合任何行业在线刷题及考试。 系统功能一览&…...

同城跑腿小程序怎么做

随着市场需求越来越大,分工越来明细,很多人看到了跑腿类的商机,特别是学校、小区、商务园等场所。无论是校园跑腿还是社会类跑腿,例中代取快递、代拿包裹、代搬东西上下楼、代排队、帮忙办事、代买东西、代送等等功能都少不了&…...

爬虫逆向学习(五):使用RPC框架serkio解决逆向难题

serkio应用实战前言实战开发多次调用加密方法破解失败如何刷新加密方法同一个浏览器的加密代码如何给不同用户使用注意事项总结前言 最近在工作中遇到了一个反爬虫产品,处于技术能力和新产品迭代更新快的考虑,最后选择使用RPC技术解决问题,因…...

NumPy 秘籍中文第二版:三、掌握常用函数

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍许多常用函数: sqrt(),log(),arange(),astype()和sum()ceil(),modf()&…...

蓝桥杯基础17:BASIC-02试题 序列求和

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 求123...n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行,包括一个整数,表示123...n…...

vue移动端实现vue-pdf在线预览与展示,并且解决页面汉字空白的问题

vue移动端实现pdf的页面在线预览展示&#xff0c;CMapReaderFactory可以解决文字不展示、空白问题 //1、安装依赖vue-pdf npm install --save vue-pdf//2、使用组件 <pdf v-for"i in numPages" ref"pdfs" :src"pdfUrl" :key"i" …...

代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

打卡第49天&#xff0c;买卖股票系列了 今日任务 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#x…...

【职场篇】程序员是否吃青春饭?程序员在35岁之后是否需要转行?

你们好 那么众所周知呢像空姐 还有模特这种职业呢 都是吃青春饭的 那么到了一定年龄呢 他们可能就不做这一行了 那么其实程序员这个职业呢 有的人认为他也是吃青春饭的 普遍人都认为呢 如果程序员做到35岁呢 没有转管理岗位 可能以后就没有什么前途了 可能就要考虑换别的行业了…...

( “树” 之 DFS) 226. 翻转二叉树 ——【Leetcode每日一题】

226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[…...

实验7---myBatis和Spring整合

实验七 myBatis和Spring整合 一、实验目的及任务 通过该实验&#xff0c;掌握mybatis和spring整合方法&#xff0c;掌握生成mapper实现类的两种生成方式。 二、实验环境及条件 主机操作系统为Win10&#xff0c;Tomcat,j2sdk1.6或以上版本。 三、实验实施步骤 略 四、实验报告内…...

DJ3-4 传输层(第四节课)

目录 一、TCP 概述 二、TCP 报文段的首部字段格式 三、TCP 往返时延的估计和超时 1. 估计往返时间 2. RTT 估计例子 3. 估计往返时间的偏差 4. 设置重传超时间隔 一、TCP 概述 全双工服务&#xff1a;允许在同一时间同一连接上&#xff0c;数据能够双向传输。注意&#…...

2023爱分析·商业智能应用解决方案市场厂商评估报告:数聚股份

目录 1. 研究范围定义 2. 商业智能应用解决方案市场分析 3. 厂商评估&#xff1a;数聚股份 4. 入选证书 1. 研究范围定义 商业智能&#xff08;BI&#xff09;是在实现数据集成和统一管理的基础上&#xff0c;利用数据存储和处理、分析与展示等技术&#xff0c;满足企…...

Kotlin方法执行顺序

方法的执行顺序 主构造函数init代码块次构造函数...

Qwen3-TTS开源大模型实战:复古HUD界面下的AI语音创作工作流

Qwen3-TTS开源大模型实战&#xff1a;复古HUD界面下的AI语音创作工作流 1. 引言&#xff1a;当AI语音合成遇上复古游戏风 想象一下&#xff0c;你不再需要面对枯燥的音频参数调节界面&#xff0c;而是走进一个像素风的游戏世界。在这里&#xff0c;生成一段AI语音就像玩一款复…...

UnityLockstep:构建零延迟多人游戏的终极同步框架

UnityLockstep&#xff1a;构建零延迟多人游戏的终极同步框架 【免费下载链接】UnityLockstep Deterministic Lockstep with clientside prediction and rollback 项目地址: https://gitcode.com/gh_mirrors/un/UnityLockstep 在多人游戏开发中&#xff0c;你是否曾为网…...

快速原型构建遇阻?用快马AI一键绕过npm error 128,聚焦核心功能验证

最近在尝试用Node.js快速验证一个Web服务原型时&#xff0c;遇到了烦人的npm error code 128问题。这个错误通常和Git仓库权限相关&#xff0c;会直接卡住依赖安装流程。经过一番折腾&#xff0c;我总结出一套在InsCode(快马)平台快速绕开这个坑的实践方案&#xff0c;分享给同…...

NOR FLASH和NAND FLASH的对比

一、擦写寿命与数据可靠性 FLASH芯片的擦写次数一般来说都是有限的&#xff0c;目前主流产品的擦写寿命普遍在10万次左右。当FLASH芯片接近使用寿命终点时&#xff0c;写操作可能会出现失败。不过&#xff0c;需要注意NAND FLASH采用整块擦写机制&#xff0c;一旦块内出现一位数…...

HTML新手入门教程(二)

一、网页图像标签以及超链接 接着上篇文章&#xff0c;这次我们来学习一下图像标签、超链接标签如何使用&#xff0c;以及使用效果。本文章我们以<img>和<a>标签来展开教学。 在 HTML 中&#xff0c;<img>标签用于在网页中插入图像。它的作用是可以把文档中…...

[实战] 从点云到避障:FIESTA ESDF实时构建全解析

1. 为什么需要实时ESDF构建 当机器人需要在复杂环境中自主移动时&#xff0c;避障是最基础也最关键的能力。想象一下你在黑暗中摸索前行&#xff0c;手碰到墙壁就立即缩回——机器人也需要类似的"触觉"。欧氏距离场&#xff08;ESDF&#xff09;就是机器人的三维空间…...

4阶段构建企业级离线文档处理平台:从问题诊断到性能优化全指南

4阶段构建企业级离线文档处理平台&#xff1a;从问题诊断到性能优化全指南 【免费下载链接】WeKnora LLM-powered framework for deep document understanding, semantic retrieval, and context-aware answers using RAG paradigm. 项目地址: https://gitcode.com/GitHub_Tr…...

告别ViT的笨重:手把手教你用SegFormer在Cityscapes数据集上实现高效语义分割

告别ViT的笨重&#xff1a;手把手教你用SegFormer在Cityscapes数据集上实现高效语义分割 在自动驾驶、遥感影像分析等计算机视觉应用中&#xff0c;语义分割技术扮演着关键角色。传统基于卷积神经网络&#xff08;CNN&#xff09;的方法虽然取得了显著进展&#xff0c;但面临着…...

Python开发者实战:用pg-mcp轻松搞定PostgreSQL集群读写分离与连接池管理

Python开发者实战&#xff1a;用pg-mcp轻松搞定PostgreSQL集群读写分离与连接池管理 现代Web应用对数据库的要求越来越高&#xff0c;特别是在高并发场景下&#xff0c;传统的单一数据库连接方式往往成为性能瓶颈。作为Python开发者&#xff0c;我们经常需要在Flask或Django项目…...

我试了opencli,3秒拿到知乎热榜——手把手教你把200+网站变成命令行

前言: 坦白说,我第一次看到opencli的时候,心想:"又一个给程序员用的 命令行工具 ,跟我没关系。" 然后我随手试了一条命令—— opencli bilibili hot 3秒钟,B站条直接出现在我眼前。标题、热度、排名,整整齐齐。 那一刻我意识到 这玩意儿不是给程序员用的,是…...