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

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

四大特性

事务的四大特性,通常被称为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.rhkb.cn/news/218036.html

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

相关文章

HHDESK个性化脚本功能

HHDESK可以把脚本配置在对话框中,生成按钮,便捷操作。 在界面下方的脚本框中,点击“”,选择新建; 随后在弹出框内填写名称及脚本,按需求选择填写参数,及运行过程中是否弹出参数框;…

Linux实用操作-上篇

Linux实用操作-下篇:Linux实用操作篇-下篇-CSDN博客 一、各类小技巧(快捷键) 1.1 ctrl c 强制停止 Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c 命令输入错误,也可以通过快捷键ctr…

如何了解蜘蛛池蚂蚁SEO

蜘蛛池是一种基于搜索引擎优化的技术手段,通过模拟蜘蛛爬行行为来提高网站在搜索引擎中的排名,从而增加网站的流量和曝光率。 编辑搜图 如何联系蚂蚁seo? baidu搜索:如何联系蚂蚁SEO? baidu搜索:如何联…

Shell三剑客:文本过滤工具——grep

一、简介&#xff1a;过滤&#xff0c;查找文档中的内容 二、分类 grepegrep——扩展支持正则\w所有字母与数字&#xff0c;称为字符[a-zA-Z0-9] l[a-zA-Z0-9]*ve l\w*ve\W所有字母与数字之外的字符&#xff0c;称为非字符 love[^a-zA-Z0-9] love\W\b词边界 \<love\>…

优先考虑泛型

Java中的泛型&#xff08;Generics&#xff09;提供了一种参数化类型的机制&#xff0c;使得你可以编写更灵活、类型安全的代码。下面是一个例子&#xff0c;说明在Java中优先考虑泛型的好处&#xff1a; 考虑一个简单的容器类&#xff0c;它可以存储任意类型的元素&#xff0…

机器人、智能小车常用的TT电机/310电机/370电机选型对比

在制作智能小车或小型玩具时&#xff0c;在电机选型上一些到各种模糊混淆的概念&#xff0c;以及各种错综复杂的电机参数&#xff0c;本文综合对比几种常用电机的参数及特性适应范围&#xff0c;以便快速选型&#xff0c;注意不同生产厂家的电机参数规则会有较大差异。 普通TT…

调用win32 api获取电脑名字和系统目录

学习一下几个函数的功能&#xff0c;和调用方式&#xff1b; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

dp入门:从记忆化搜索到递推 灵神[基础算法精讲17]

198. 打家劫舍 链接 : 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解决 : 1.记忆化搜索(自顶向下) ; class Solution { public:int rob(vector<int>& nums) {// 记忆化搜索int n nums.size();vector<int> memo(n,-1); //…

Doris学习笔记

目录 简介 特点 MPP数据库 PB和EB都是用来衡量数据存储量的单位。 秒级响应 Google Mesa Apache Impala 支持标准sql且兼容mysql协议 ROLAP OLAP&#xff08;On-Line Analytical Processing&#xff0c;联机分析处理&#xff09; ROLAP&#xff08;Relational On-Line An…

【PWN】学习笔记(三)【返回导向编程】(中)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

最新盲盒交友脱单系统源码

盲盒交友脱单系统源码&#xff0c;学校 爱好 城市 地区 星座等等&#xff0c;首页轮转广告&#xff0c;页面美化&#xff0c;首页两款连抽高质量底部连抽&#xff0c;后台选择开关&#xff0c;邀请奖励爱心或者&#xff0c;提现达到金额有提成奖励&#xff0c;二级分销&#xf…

canvas基本绘制对象

目录 绘制画布 设置画布 绘制圆形 绘制矩形填充渐变色 绘制文字及文字样式 绘制画布 <canvas id"canvas" width"800" height"600"></canvas> 设置画布 //获得画布元素var canvasdocument.getElementById(canvas);var ctxca…

Python求小于m的最大10个素数

为了找到小于m的最大10个素数&#xff0c;我们首先需要确定m的值。然后&#xff0c;我们可以使用一个简单的算法来检查每一个小于m的数字是否是素数。 下面是一个Python代码示例&#xff0c;可以找到小于m的最大10个素数&#xff1a; def is_prime(n): if n < 1: …

DAP数据集成与算法模型如何结合使用

企业信息化建设会越来越完善&#xff0c;越来越体系化&#xff0c;当今数据时代背景下更加强调、重视数据的价值&#xff0c;以数据说话&#xff0c;通过数据为企业提升渠道转化率、改善企业产品、实现精准运营&#xff0c;为企业打造自助模式的数据分析成果&#xff0c;以数据…

乐益达教育网页

目录 一、网页效果 二、html代码 三、CSS代码 四、JS代码 一、网页效果 二、html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

excel数据重复率怎么计算【保姆教程】

大家好&#xff0c;今天来聊聊excel数据重复率怎么计算&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; excel数据重复率怎么计算 在Excel中计算数据重复率可以通过以下步骤实现&#xff1a; 1. 确定重复…

priority_queue的实现,容器和仿函数

首先我们要实现priority_queue就必须要了解其底层&#xff0c;本质其实就是堆排序&#xff0c;大根堆就是升序排序&#xff0c;小根堆就是降序排序。 原因是因为&#xff0c;我们堆排序取元素可以将堆顶和最后一个元素交换&#xff0c;然后让堆顶下沉&#xff0c;这样可以维护…

AWTK 串口屏开发(2) - 数据绑定高级用法

AWTK 串口屏 智能家居示例 1. 功能 这个例子稍微复杂一点&#xff0c;界面这里直接使用了 立功科技 ZDP1440 HMI 显示驱动芯片 例子中的 UI 文件和资源&#xff0c;重点关注数据绑定。在这里例子中&#xff0c;模型&#xff08;也就是数据&#xff09;里包括一台空调和一台咖…

俄罗斯军方计划用 Astra Linux 取代 Windows!

网络安全正在改变全球化的面貌&#xff0c;各国政府为了防范外国的间谍和破坏活动&#xff0c;正积极发展自己的技术。在这一趋势下&#xff0c;俄罗斯军方已经开始用 Linux 发行版 Astra Linux 替换 Windows 系统。 如何提高Linux系统安全性&#xff1f;提升Linux安全的关键策…

ChatGPT 成为 Nature 年度十大人物,首个非人类实体

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 2023 年即将结束&#xff0c;现在是时候回顾今年的重要科学进展了。12 月 13 日&#xff0c;著名科学期刊《Nature》刚刚发布了 2023 年度的十大人物&…