SQL 事务基础

news/2025/1/12 17:52:16/

事务基础

1 事务概念

所谓事务就是用户定义的一个数据库操作序列,这些操作要么全做,要不全不做,是一个不可分割的工作单位。

2 事务的特性(ACID)

原子性(atomicity)

事务是数据库工作的逻辑单位,事务中的操作要么都做,要么都不做。

一致性(consistency)

一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 。这种状态 是 语义上 的而不是语法上的,跟具体的业务有关。

隔离型(isolation)

事务的隔离性是指一个事务的执行不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的 其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

image-20221226104109336

持久性(durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。

持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。当我们通过事务对数据进行修改 的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做 的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执 行,从而使事务具有持久性。

3 事务隔离级别

脏写( Dirty Write )

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

image-20221226152315723

脏读( Dirty Read )

对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。 之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的。

image-20221226152606963

不可重复读( Non-Repeatable Read )

对于两个事务Session A、Session B,Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后 Session A 再次读取 同一个字段, 值就不同 了。那就意味着发生了不可重复读。

我们在Session B中提交了几个 隐式事务 (注意是隐式事务,意味着语句结束事务就提交了),这些事务 都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可以查看 到最新的值,这种现象也被称之为 不可重复读 。

image-20221226160849126

幻读( Phantom )

对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插 入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。

image-20221226161410145

4 SQL中的四种隔离级别

READ UNCOMMITTED :读未提交

在该隔离级别,所有事务都可以看到其他未提交事务的执行结 果。不能避免脏读、不可重复读、幻读。

READ COMMITTED :读已提交

它满足了隔离的简单定义:一个事务只能看见已经提交事务所做 的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可 重复读、幻读问题仍然存在。

REPEATABLE READ :可重复读

事务A在读到一条数据之后,此时事务B对该数据进行了修改并提 交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍 然存在。这是MySQL的默认隔离级别

SERIALIZABLE :可串行化

确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止 其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避 免脏读、不可重复读和幻读。

image-20221226162528391


http://www.ppmy.cn/news/6866.html

相关文章

Springboot 统计 代码执行耗时时间 ,玩法多到眼花

前言 近日群里有萌新提到关于统计代码执行时间的事: 开始 System.currentTimeMillis() 减去 结束 System.currentTimeMillis() 等于 耗时 其实我个人感觉OK的,就这样就蛮好的,很多项目都是这样用的。 简简单单的挺好。 这一篇就是 …

python 串口通信

需要准备好的工具 windows上找个串口通信工具 Linux上查看设备列表 有可能需要安装串口驱动,去设备管理器中安装一下 或这个一般串口开发,厂家都会给驱动和串口调试工具 如果串口调试工具调试没有问题了 接下来你用python代码调试 你需要在python环境中安装pyserial库 pip …

通过静态LSP、LDP LSP、MPLS TE三种方式实现总部与分支的互通

一、静态LSP 特点:类似静态路由,简单易用,手动建立lsp,定制转发路径,无需控制报文,资源消耗少。 缺点:不适合大型复杂拓扑,不能根据网络变化而动态调整,需要管理员手动调…

Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

汽车OTA概述

文章目录 前言一、软件更新二、ECU刷写包复用 1.引入库2.读入数据总结前言 掌握OTA(Over-The-Air,无线技术),汽车领域与IT领域正在技术融合! 技术更新,也增加了车载应用场景,软件更新、实时诊…

lua 基本语法

数据类型 lua是动态语言类型,变量不需要类型定义,只需要为变量赋值 lua有8个基本类型: 数据类型描述nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。boolean包…

Nmap系统扫描实战

今天继续给大家介绍渗透测试相关知识,本文主要内容是Nmap系统扫描实战。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设备…

沙盘游戏咨询感悟

一、沙盘游戏操作流程 1.和来访者进行交流。咨询刚开始,我和来访者进行了简单的交流,获得来访者的好感与信任,并用心倾听来访者的诉求。来访者在倾诉时语速很快,我感受到她的担心与焦虑,迫切想找到解决问题的方法&…