SQL事务管理

 事务管理是针对数据库的一组操作。由一条或多条SQL语句组成,这些语句在逻辑上具有强烈的相关性,如果其中一条语句无法执行,那么所有的语句都不会执行。

1 事务管理

原子性

指一个事务必须被视为一个不可分割的最小单元。只有事务中所有的数据操作都执行成功,才算整个事务都执行成功。

一致性

事务执行前后,数据库的状态(所有的约束条件、完整性规则和触发器)必须保持一致。

隔离性

每个事务的执行都应该与其他事务相互隔离,使得每个事务感觉不到其他事务的存在。

持久性

一旦事务提交,其所做的修改将会永久保存在数据库中。即使系统故障或重启后也不会丢失。

表 事务的四个特性

事务有以下的优点:

  1. 并发控制,事务可以管理并发访问数据库的能力。保证多个并发执行的事务不会相互干扰或产生不一致的结果。确保每个事务的操作在逻辑上相互隔离,避免了数据竞争和冲突。
  2. 错误恢复,如果事务执行过程发生错误,事务可以被回滚,撤销之前的操作,将数据库状态恢复到事务开始之前的状态。
  3. 高效性,通过将多个相关操作组合在一个事务中,可以减少与数据库的交互次数,提高效率。

1.1 事务基本用法

START TRANSACTION; -- 开启事务

SAVEPOINT label1; -- 保存回滚节点

ROLLBACK TO label1; -- 回滚到具体的节点

ROLLBACK; -- 回滚整个事务

COMMIT; -- 提交事务

START TRANSACTION;INSERT teacher(id,name) VALUES(4,"刘老师");SAVEPOINT label1;INSERT teacher(id,name) VALUES(5,"张老师");ROLLBACK TO label1;COMMIT;  -- 最终,只有第一条信息会被插入id=4

1.2 事务并发引发的问题

1)脏读。一个事务处理过程中读取了另一个未提交的事务中的数据。

当数据库的事务隔离级别为读未提交(RU,READ-UNCOMMITTED)时,会出现这个问题。

-- 事务隔离级别为“读未提交”START TRANSACTION;UPDATE teacher SET `name`=CONCAT(`name`,"(未提交事务)") WHERE id = 4;ROLLBACK -- 先不执行,先在其他事务查询这条数据,发现name="刘老师(未提交事务)",然后再执行回滚

将数据库隔离级别设置为其他的级别(比如读已提交),则不会有这个问题。

2)不可重复读。在一个事务中,多次读取同一个数据时,读取的数据不一致。(数据被更新了update)。

-- 隔离级别为“读已提交”START TRANSACTION;SELECT `name` FROM teacher WHERE id = 4;SELECT SLEEP(30); -- 休眠30s,在这个时间在另一个事务中执行update操作,来跟新id=4的数据SELECT `name` FROM teacher WHERE id = 4;COMMIT;

将隔离级别设置为可重复读或可串行化则不会出现这个问题。

3)幻读。读取某一范围的数据时,在一个事务中多次读,结果不一致。(发生在插入或删除数据时。)

-- 隔离级别为 "读已提交",注意mysql 的“可重复读”不会出现这个问题。START TRANSACTION;SELECT * FROM teacher WHERE name = '刘老师';SELECT SLEEP(20); -- 休眠20s,在这段时间在另一个事务执行insert操作,来插入新刘老师的数据SELECT * FROM teacher WHERE name = '刘老师';COMMIT;

mysql 将隔离级别设置为可重复读或可串行化则不会出现这个问题。

1.3 事务的隔离级别

读未提交 RU

READ UNCOMMITTED

可以读取到事务未提交的数据,隔离性差。

读已提交 RC

READ COMMITTED

读取事务已提交的数据,隔离性一般。

可重复读 RR

REPEATABLE READ

默认。在一个事务中多次读取同一个数据时,能够保证读取到的数据一致(即使其他事务修改了该数据)。

可串行化 SR

SERIALIZABLE

最高隔离级别。保证所有事务之间的执行顺序按照某个顺序执行,避免了所有并发问题。事务并发性最差。

表 事务的四种隔离级别

读未提交

读已提交

可重复读

可串行化

脏读

x

不可重复读

x

x

幻读

x

x

表 不同隔离级别下所解决的问题

注意:MySQL 隔离级别为可重复读解决了“幻读”的问题。

SHOW VARIABLES LIKE "transaction_isolation"; -- 查看数据库的隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 设置全局隔离级别为“读未提交”。需要重新连接数据库才会生效。

1.4 当前读和快照读

当前读,读取最新提交的数据。(隔离级别为可串行化)。

快照读(一致性读),读取某一时间点的数据。(隔离级别为读提交或可重复读)。

在读提交隔离级别下,每次SELECT都会建立新的快照。

在可重复读隔离级别下,建立快照的时机为:

  1. 事务启动后,首次SELECT。
  2. 事务启动时选择了with consistent snapshot,则在启动时建立快照。
  3. 基于旧数据的修改操作(或insert及delete操作),会重新建立快照。
-- 隔离级别为 "可重复读"START TRANSACTION;SELECT * FROM teacher WHERE name LIKE '%刘老师%'; -- 建立快照SELECT SLEEP(20); -- 休眠20s,在这段时间在另一个事务执行insert操作,来插入新刘老师的数据INSERT INTO teacher(`name`) VALUES('刘老师'); -- 数据插入或删除会建立新的快照UPDATE teacher SET `name` = '刘老师(旧数据修改)' WHERE id = 2; -- 旧数据修改,会建立新的快照SELECT * FROM teacher WHERE name LIKE '%刘老师%';COMMIT;

注意,上面查询的结果虽然不一致,这是因为在同一个事务中进行修改或插入操作。因此不是幻读。 而如果在休眠的20s中在其他事务中执行了插入操作,依旧不会影响查询结果。因为快照读是基于MVCC(多版本并发控制)实现的。

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

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

相关文章

Django、Echarts异步请求、动态更新

前端页面 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>echarts示例</title> <script src"jquery.min.js"></script><script type "text/javascript" src "echarts.m…

什么是PHP的SPL(标准PHP库)?

SPL&#xff08;Standard PHP Library&#xff09;是 PHP 中的标准库&#xff0c;提供了一组用于解决常见问题的接口和类。它包含了一系列的数据结构、算法、迭代器、文件处理、异常处理等组件&#xff0c;使得 PHP 开发者能够更方便地处理各种编程任务。 SPL 提供的主要组件包…

Rancher中使用promtail+loki+grafna收集k8s日志并展示

Rancher中使用promtail+loki+grafna收集k8s日志并展示 根据应用需求和日志数量级别选择对应的日志收集、过滤和展示方式,当日志量不太大,又想简单集中管理查看日志时,可使用promtail+loki+grafna的方式。本文找那个loki和grafana外置在了k8s集群之外。 1、添加Chart Repo …

Pencile - exer

import java.util.HashMap; import java.util.Map;public class TableConverter {public static void main(String[] args) {// 示例输入数据String[] inputData {"line1 col1 A","line2 col3 B","line3 col1 C","line4 col2 D",};//…

云架构的思考4--云上灾备

目录 1 关键指标2 灾备方案3 云上灾备常见模式3.1 “地域”模式3.2 “应用”模式3.3 “数据”模式 4 总结 前几章讲了云上架构、开发等事项&#xff0c;其实灾备也算是架构中的一步&#xff0c;但是这里特意拎出来讲主要有2个原因&#xff0c;其一是因为灾备相对独立且复杂&…

Linux-----5、文件系统

# 文件系统 # 终端的基本操作 ㈠ 打开多个终端 ㈡ 快速清屏 新建标签&#xff1a;command T 新建窗口&#xff1a;command N 关闭标签&#xff1a;command Q 关闭窗口&#xff1a;command W 放大&#xff1a;command 缩小&#xff1a;command - 清屏&#xff…

智慧城市/一网统管建设:人员危险行为检测算法,为城市安全保驾护航

随着人们压力的不断增加&#xff0c;经常会看见在日常生活中由于小摩擦造成的大事故。如何在事故发生时进行及时告警&#xff0c;又如何在事故发生后进行证据搜索与事件溯源&#xff1f;旭帆科技智能视频监控人员危险行为/事件检测算法可以给出答案。 全程监控&#xff0c;有源…

函数节流(js的问题)

函数节流也用到了高阶函数的知识&#xff0c;因为比较重要&#xff0c;所以单开了一个标题。 javascript中的函数在大多数情况下都是由用户主动调用触发的&#xff0c;除非是函数本身的实现不合理。但是在一些少数情况下&#xff0c;函数可能被很频繁的调用&#xff0c;而造成大…

【Linux】多线程编程

目录 1. 线程基础知识 2. 线程创建 3. 线程ID&#xff08;TID&#xff09; 4. 线程终止 5. 线程取消 6. 线程等待 7. 线程分离 8. 线程互斥 8.1 初始化互斥量 8.2 销毁互斥量 8.3 互斥量加锁和解锁 9. 可重入和线程安全 10. 线程同步之条件变量 10.1 初始化条件变…

Qt图像处理-亮度、对比度、灰度、锐化、负片的实现

本文演示Qt中图像的亮度、对比度、灰度、锐化、负片处理实现 一、概述 亮度和对比度原理 图像亮度通俗理解便是图像的明暗程度,数字图像 f(x,y) = i(x,y) r(x, y) ,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。而且我们也要把亮度和对比…

Maven下载及安装自用版

Maven下载及安装自用版 可能是Maven用久了。感觉Maven用起来还算顺手&#xff0c;比Gradle要好上手一些。 一、下载 Maven 下载地址 注意下载版本和依赖要求&#xff0c;下载后&#xff0c;解压放在指定的位置;注意安装地址&#xff0c;放在自己规划好的开发环境专用文件夹里…

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…

C++类与对象(一)

目录 一&#xff0c;面向过程和面向对象初步认识 二&#xff0c;类的引入 三&#xff0c;类的定义 四&#xff0c;类的访问限定符及封装 五&#xff0c;类的实例化 六&#xff0c;类对象模型 七&#xff0c;this指针 一&#xff0c;面向过程和面向对象初步认识 c语言是面…

使用动画曲线编辑器打造炫酷的3D可视化ACE

前言 在制作3D可视化看板时&#xff0c;除了精细的模型结构外&#xff0c;炫酷的动画效果也是必不可少的。无论是复杂的还是简单的动画效果&#xff0c;要实现100%的自然平滑都是具有挑战性的工作。这涉及到物理引擎的计算和对动画效果的数学建模分析。一般来说&#xff0c;只…

HPM6750系列--第七篇 Visual Studio Code使用openocd调试查看外设信息

一、目的 在《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》我们已经手把手指导大家如何在visual studio code中进行开发&#xff0c;包括编译调试等步骤以及相关配置文件。 但是在实际调试时发现找不到芯片寄存器实时显示的窗口&#xff0c;本篇主要讲解如何实现…

天翼云盘秒变硬盘分享

https://cloud.189.cn/web/share?codeAvUnqaj6NNza&#xff08;访问码&#xff1a;wf4r&#xff09;y 以下介绍为作者开发的单机版软件&#xff0c;可用于Windows环境中将天翼云盘挂载为本地硬盘&#xff0c;确实可以达到本地硬盘的使用感知&#xff0c;对于多终端数据副本一…

电子信息、物联网专业大学生如何提高动手能力

作为一名电子类或物联网类专业学生&#xff0c;仅仅掌握专业基础理论知识是不够的&#xff0c;还需要增加实际动手能力和实践经验。那么&#xff0c;动手实践能力真的那么重要吗&#xff1f;我们应该怎么提高动手能力呢&#xff1f;本文就谈谈这些问题。 所谓动手能力&#xf…

移植Modelsim仿真工程

背景 上班在公司用的PC1生成并完整的进行了仿真&#xff0c;打包成zip&#xff0c;经过微信传输并在家里的PC2上打开想要继续进行仿真&#xff0c;需要如何处理呢&#xff1f; 环境 软件路径公司PC1Quartus II Prime Pro 21.4C:\intelfpga_pro\21.4\quartus\bin64\qpro.exeMo…

python的Pandas库介绍

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

JAVA:深入探讨Map的多种遍历方式

1、简述 在现代编程中&#xff0c;Map&#xff08;映射&#xff09;是一种常见的数据结构&#xff0c;用于存储键-值对。在许多编程语言中&#xff0c;Map提供了灵活的数据组织方式&#xff0c;但为了充分发挥其功能&#xff0c;我们需要了解多种遍历方式。本文将深入探讨Map的…