MySQL中的事务

server/2024/11/15 4:22:23/

一、事务是什么???

事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。

二、事务的特性

原子性:意味着数据库中的事务执行是作为原子粒度即不可再分,整个语句要么执行要么不执行。
一致性:即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时中间某一时刻的数据。
持久性:意味着在事务完成以后 ,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 

三、MySQL实现事务的方法

四、MySQL实现事务的步骤

五、事务的原子性、一致性、持久性

五、事务的隔离性

  什么是事务的隔离性:为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离, 事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行
用什么方式实现事务的隔离性: 通常数据库里都是采用锁的机制,保证事务之间的隔离性。 

六、MySql中的锁 

锁分类: 基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁,X锁)。
基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)。
基于锁的状态分类:意向共享锁、意向排它锁。 

七、事务的隔离级别

八、事务的隔离级别

九、事务并发时出现的问题

1.脏写( Dirty Write )

对于两个事务 Session A、Session B,如果事务Session A 修改了 另一个 未提交 事务Session B 修 改过 的数据,那就意味着发生了 脏写
2.脏读( Dirty Read )

对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的 字段。 之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的。 Session A和Session B各开启了一个事务,Session B中的事务先将studentno列为1的记录的name 列更新 为'张三',然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的值为' 张三',而 Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据, 这种现象 就称之为 脏读 。 
3.不可重复读( Non-Repeatable Read )

对于两个事务Session A、Session B,Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后 Session A 再次读取 同一个字段, 值就不同 了。那就意味着发生了不可重复读。 我们在Session B中提交了几个 隐式事务 (注意是隐式事务,意味着语句结束事务就提交了),这些事务 都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可以查看 到最新的值,这种现象也被称之为 不可重复读 。
4.幻读( Phantom )

对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插 入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。 Session A中的事务先根据条件 studentno > 0这个条件查询表student,得到了name列值为'张三'的记录; 之后Session B中提交了一个 隐式事务 ,该事务向表student中插入了一条新记录;之后Session A中的事务 再根据相同的条件 studentno > 0查询表student,得到的结果集中包含Session B中的事务新插入的那条记 录,这种现象也被称之为 幻读 。我们把新插入的那些记录称之为 幻影记录 。

十、InnoDB的MVCC

  MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个 版 本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有 了保 证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值, 这样 在做查询的时候就不用等待另一个事务释放锁。 MVCC 的实现依赖于:隐藏字段、Undo Log、Read View。 InnoDB就是通过MVCC机制解决可重复读中的幻读问题。


http://www.ppmy.cn/server/108355.html

相关文章

34. 打字机效果 水平滚动贴合

打字机效果 创建打字机效果动画。 定义两个动画,typing 用于字符动画,blink 用于光标动画。使用 ::after 伪元素在容器元素中添加光标。使用 JavaScript 为内部元素设置文本,并设置包含字符数的 --characters 变量。这个变量用于文本动画。使用 white-space: nowrap 和 overfl…

LuaJit分析(五)LuaJit filename分析

LuaJit执行文件过程分析 通过之前对luajit -b命令的分析可知,在luajit.c文件的runargs函数中,用于手机参数,对相应的参数调用对应的函数,若返回LUA_OK则执行handle_script函数,该函数用于执行一个lua脚本文件&#xf…

基础概念与简单数据结构的笔记02

学习内容: 栈(Stack): 栈的定义、基本操作(Push、Pop、Peek)、应用场景。 队列(Queue): 队列的定义、基本操作(Enqueue、Dequeue)、应用场景。双端队列&#…

【JPCS独立出版】2024电驱系统与控制工程国际学术研讨会(EDSCE 2024,10月18-20)

2024电驱系统与控制工程国际学术研讨会(EDSCE 2024)将于2024年10月18-20日在中国本溪隆重举行。 本次会议将集中讨论电驱系统与控制工程的最新研究成果,旨在建立一个高水平的学术交流平台,以便领域内的专家学者、工程师和技术研发…

redis单线程 ,当redis在执行lua脚本的时候,会执行其他redis操作吗?

Redis有三种类型的线程:主线程,多个bio线程,后台线程。 Redis Server进程的5个线程,其中第一个是后台线程,中间三个是bio线程,最后是main主线程 Redis执行Lua脚本,已经数据操作本身&#xff0c…

虚幻5|技能栏优化(1)---优化技能UI,并添加多个技能

一.添加多一个技能格子并进行初始化清楚 1.打开技能UI把原先的事件构造后面的蓝图,全部选中,右键创建一个函数,命名为初始化 2.添加以下两个蓝图,用于清楚技能格子内容 2.在之前,事件构造后面的蓝图,不需…

SpringBoot+Vue餐馆点菜系统小程序

项目描述 餐馆点菜系统小程序是一个集成了多种功能的移动应用,旨在提供用户便捷的点餐体验和餐厅高效的订单管理。以下是针对您所提到的功能的简单介绍: 前台小程序:用户通过手机上的小程序,可以浏览餐厅的菜单、选择菜品、下单并…

【Datawhale AI夏令营】从零上手CV竞赛Task2

文章目录 前言一、YOLO是什么?二、YOLO的历史三、性能指标四、 性能指标计算公式五、性能优化总结 前言 本文的Task2是对Task1的baseline代码进行优化的过程。 一、YOLO是什么? 首先简单介绍一下YOLO模型: 物体检测算法主要分为两类&#…