事务的四个特性、四个隔离级别以及数据库的常用锁

事务的四个特性、四个隔离级别以及数据库的常用锁

四大特性

事务的四大特性,通常被称为ACID特性,是数据库管理系统(DBMS)确保事务处理的关键属性。这四大特性分别是:

  1. 原子性(Atomicity): 原子性要求事务是一个不可分割的单位,要么全部执行,要么全部不执行。如果事务中的任何一部分操作失败,整个事务都必须回滚到最初状态,没有部分完成的情况。
  2. 一致性(Consistency): 一致性确保事务使数据库从一个一致性状态转变为另一个一致性状态。在事务执行前和执行后,数据库必须保持一致性。例如,在银行转账中,无论操作成功与否,账户总额必须保持一致。
  3. 隔离性(Isolation): 隔离性指多个事务可以并发执行,但其执行的效果不能相互影响。每个事务应该感觉好像它是系统中唯一运行的事务一样,而不受其他并发事务的影响。这有助于防止并发事务之间的数据不一致性问题。
  4. 持久性(Durability): 持久性确保一旦事务提交,其结果将永久保存在数据库中,即使系统崩溃或重新启动,提交的更改也不会丢失。

并发问题

数据库并发访问可能导致多种问题,主要与多个事务同时操作数据库时的交互有关。并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能是致命的。

  1. 脏读(Dirty Read): 一个事务读取了另一个事务尚未提交的数据。如果事务A读取了事务B的未提交数据,而事务B后来回滚了,那么事务A读取的数据就是脏数据。
  2. 不可重复读(Non-repeatable Read): 一个事务在两次读取同一数据之间,该数据被其他事务修改,导致两次读取的结果不同。这可能导致事务在处理相同数据时得到不一致的结果。
  3. 幻读(Phantom Read): 一个事务按相同的查询条件重新读取已检索的数据,但在两次读取之间,其他事务插入了新的数据,导致第二次读取的结果不同。这与不可重复读不同,因为幻读涉及到一批数据整体的变化。
  4. 丢失修改(Lost Update): 两个事务同时读取相同的数据,然后都进行修改,并尝试提交。由于事务是并发执行的,可能存在其中一个事务的修改被覆盖,导致数据的丢失。
  5. 死锁(Deadlock): 多个事务相互等待对方释放锁资源,导致它们无法继续执行。这是一种阻塞现象,需要通过某种机制来检测和解除死锁。

这些问题在多用户、多事务并发访问数据库时可能出现,为了处理这些问题,数据库系统提供了不同的隔离级别,例如读未提交、读已提交、可重复读和串行化,以允许开发人员根据应用的需求选择适当的隔离级别。

四个隔离级别

事务的四个隔离级别是指在数据库管理系统中,用于控制并发事务之间相互影响的不同级别。这些隔离级别分别是:

  1. 读未提交(Read Uncommitted):
    • 事务可以读取其他未提交事务的数据。
    • 可能导致脏读、不可重复读和幻读等问题。
  2. 读已提交(Read Committed):
    • 事务只能读取已经提交事务所做的修改。
    • 可以避免脏读,但仍可能出现不可重复读和幻读等问题。
  3. 可重复读(Repeatable Read):
    • 事务在开始读取数据(事务开启)时,不允许其他事务对该数据进行修改。
    • 解决了不可重复读问题,但仍可能存在幻读。
  4. 串行化(Serializable):
    • 最高的隔离级别,确保事务按顺序执行,避免脏读、不可重复读和幻读等问题。
    • 提供最高的数据一致性,但可能导致性能下降,因为事务需要等待其他事务释放锁。
脏读** 不可重复读**幻读
Read Uncommited
Read Commited×
Repeatable Read××
Serializable×××
对应的是Up date操作对应insert操作

图片来自: 事务的四种隔离级别详解_事务隔离级别-CSDN博客

脏读:一个事务读取另一个未提交的数据。

img

**不可重复读:**一个事务范围内两个相同的查询却返回了不同数据。

img

**幻读:**一个事务范围内两个相同的查询却返回了不同数据。对应的是插入操作。

img

数据库的常用锁

上锁了都可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

锁的粒度划分

1、表级锁(Table-level lock)

直接给整个表添加锁:

select * from student where name = 'tom' for update
1

InnoDB在使用过程中只要不通过索引检索数据时,全部是表锁。
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

2、行级锁(Record Locks)

InnoDB中给指定的行添加锁:

select * from student where id > 10 for update
1

InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB只有通过索引条件检索数据,InnoDB才使用行级锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强

3、页级锁

页级锁是 MySQL 中比较独特的一种锁定级别,在其他数据库管理软件中并不常见。页级锁是对表中的页进行加锁,每个页的大小是固定的,一般为4KB
页级锁的颗粒度介于行级锁与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力同样也是介于上面二者之间。另外,页级锁和行级锁一样,会发生死锁。
页级锁主要应用于 BDB 存储引擎。

锁级别划分

1、共享锁(share lock,即S锁)

共享锁(S):又称读锁,允许一个事务去读取一行,阻止其他事务获得相同数据集的排它锁,若事务T对数据对象A加上S锁,则事务T可以读A,但不能修改A,其他事务只能对再对A加S锁,而不能加X锁,直到T释放A上的锁,这保证了其他事务可以读A,但在释放A上的S锁之前不能对A做任何修改。

我们有如下测试数据:

image-20231211212508055

共享锁:

START TRANSACTION;
SELECT * FROM test WHERE id = 1 LOCK IN SHARE MODE;

image-20231211212836159

别的线程是可以查询到数据的。

但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

image-20231211213111277

2、排它锁 / 独占锁(exclusive lock,即X锁)

排它锁(X):又称写锁,允许获取排它锁的事物更新数据,阻止其他事务取得相同的数据集共享读锁和排它写锁,若事务T对数据对象A加上X锁,事物T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T 释放A上的锁

现在我们对id=1的数据行排他查询

排他锁:

START TRANSACTION;
SELECT * FROM test WHERE id = 1 FOR UPDATE;

image-20231211213355701

image-20231211213540682

可以看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

3、意向锁

事物B对一行数据使用行锁,当有另一个事物A对这个表使用了表锁,那么这个行锁就会升级为表锁,事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的写锁时就会失败,因为表上有意向排他锁之后事务B申请表的写锁时会被阻塞。

需要强调一下,意向锁是一种不与行级锁冲突的表级锁

死锁

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。如下图所示:

image-20231211204629080

如下表

CREATE TABLE `test` (
  `id` int(20) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中数据有:

image-20231211205017586

两个事务对一个表进行如下操作:

navicat创建两个查询

每个查询都一步一步执行

查询1:

START TRANSACTION;
select * from test where id = 3 for update;
insert into test(id, name) values(3, "王五"); 

查询2:

START TRANSACTION;
select * from test where id = 4 for update;
insert into test(id, name) values(4, "赵六"); 

会出现死锁

image-20231211210046614

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务-理论 分布式事务

一、分布式事务理论模型 分布式事务问题也叫分布式数据一致性问题,简单来说就是如何在分布式场景中保证多个节点数据的一致性。分布式事务产生的核心原因在于存储资源的分布性,比如多个数据库,或者MySQL和Redis两种不同存储设备的数据一致性…

安装ThingBox Eclipse Plugin

1. ChatGPT问 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官网下载 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0(需要账号&#xff09…

04-Nacos中负载均衡规则的配置

负载均衡规则 同集群优先 默认的ZoneAvoidanceRule实现并不能根据同集群优先的规则来实现负载均衡,Nacos中提供了一个实现叫NacosRule可以优先从同集群中挑选服务实例 当服务消费者在本地集群找不到服务提供者时也会去其他集群中寻找,但此时会在服务消费者的控制台报警告 第…

day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)

ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发,准备SSM…

mysql数据库学习笔记(1)

今天开始学mysql数据库,为什么要学这个呢,因为数据库可结构化存储大量的数据信息,方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求,把数据放在…

WPF仿网易云搭建笔记(4):信息流控制之消息订阅

文章目录 专栏和Gitee仓库前言消息订阅最简单的案例简单用例父组件订阅子组件回调 结果 消息订阅机制消息token是A还是B?传递消息的载体。双重token重复订阅问题 结论 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 上一篇文章中,我们简单…

【三维重建】对极几何

极几何描述了同一场景或者物体的两个视点图像间的几何关系 可以发现P在左右相机的投影点一定在各自的极线上,如果求出极线就能缩小求解对应点的范围。 本质矩阵对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述 规范化相机指的是相机的内参…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流,升压转换器 概述 : YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET,以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…

大模型应用_ChatGPT-Next-Web

1 用后感 这个工具,我也是用了好长时间,就是感觉如果不点亮一颗星,自己就不是人了的那种。 一开始在国内用 ChatGPT 非常麻烦,就买了一个套壳的服务,他使用的界面就是 ChatGPT-Next-Web,我和朋友们都觉得这…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

第二百零二回 介绍一个三方包bluetooth_enable_fork

文章目录 1. 概念介绍2. 使用方法2.1 自定义主题2.2 覆盖父主题 3. 示例代码 我们在上一章回中介绍了图片缩放相关的内容,本章回中将介绍如使用主题.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的主题包含两方面的内容:…

`int(1)` 和 ‘int(10)‘

1 困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解释。 …

网络测试工具:tcping-测试端口连接

网络测试工具:tcping-测试端口连接 平常使用的ping,是通过icmp协议去测试网络连通性的,tcping是通过tcp三次握手测试端口的连通性。总的来说,ping测试的是L3的连通性,tcping测试的是L4的连通性。 tcping工具下载 htt…

基于轻量级神经网络GhostNet开发构建光伏太阳能电池缺陷图像识别分析系统

工作中经常会使用到轻量级的网络模型来进行开发,所以平时也会常常留意使用和记录,在前面的博文中有过很多相关的实践工作,感兴趣的话可以自行移步阅读即可。 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、mobil…

PHP基础(1)

PHP是一种服务器端脚本语言,是一种用于开发动态Web应用程序的最流行和广泛使用的语言之一。它的全称为“Hypertext Preprocessor”,是一种开源的、可嵌入HTML的脚本语言,可以嵌入到HTML中,也可以直接作为命令行脚本运行。PHP脚本在…

Redis对象——内存回收,对象共享和空转时长

一. 内存回收 因为C语言不具备内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。 内每一个对象的引用计数信息…

node-sass@4.14.1 postinstall: `node scripts/build.js`

遇到一个前端项目安装node-sass依赖的问题:node-sass4.14.1 postinstall: node scripts/build.js 提供一个解决思路: 1、把package.json中node-sass这一行删掉 2、Terminal中执行 npm i node-sass -D 重新安装 3、package.json中会新增一个匹配当前n…

解读unity内置的软阴影处理方式

解读unity内置的软阴影处理方式: 参考网址: https://blog.csdn.net/cgy56191948/article/details/105726682 https://blog.csdn.net/weixin_45776473/article/details/119582218 https://tajourney.games/5482/ 上面的博客已经论述了,为何出现…

【基于LSTM的股票数据预测与分类】

基于LSTM的股票数据预测与分类 引言数据集与爬取数据处理与可视化股票预测与分类Flask页面搭建股票推荐功能创新点结论 引言 股票市场波动剧烈,对于投资者而言,精准的数据预测和分类是制定明智决策的基础。本文将介绍一种基于长短时记忆网络&#xff08…