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

news2024/12/27 10:47:44

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

四大特性

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

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

相关文章

银河麒麟v10系统SSH远程管理及切换root用户的操作方法

📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​ 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一…

Python基础期末复习 新手 2

虽然age 10在__init__方法中定义了一个局部变量age,但这个局部变量并不会影响类属性age的值。类属性是在类级别上定义的,不属于任何一个实例。因此,在创建实例s1和s2时,它们的age属性值都为类属性的初始值0。 尽管对类的属性值进…

1.鸿蒙应用程序开发app_hap开发环境搭建

1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

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

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

SpringBootWeb请求响应之前言及状态码的详细解析

SpringBootWeb请求响应 前言 在上一次的课程中,我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。 其实呢,是我们在浏览器发起请求…

孩子还是有一颗网安梦——Bandit通关教程:Level0

🕵️‍♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…

JAVA定时任务技术总结

在日常的项目开发中,多多少少都会涉及到一些定时任务的需求。例如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表,定时去扫描某个表的异常信息(最终一致性的方案也可能涉及&a…

五.单行函数

单行函数 1.函数的理解1.1什么是函数1.2不同DBMS函数的差异1.3MySQL的内置函数分类 2.数值函数2.1基本函数2.2角度与弧度互换函数2.3三角函数2.4指数与对数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天数…

CentOS上配置和管理HTTP服务器的工具和实用程序

在CentOS系统上,有多个工具和实用程序可以帮助你配置和管理HTTP服务器。以下是一些常用的工具和实用程序: Apache HTTP服务器: Apache是CentOS上最常用的HTTP服务器之一。它是一个开源的Web服务器软件,具有高度的可配置性和可扩…

西工大网络空间安全学院计算机系统基础实验二(phase_2上——死寂的长夜)

自从西工大网络空间安全学院计算机系统基础实验二(清楚实验框架及phase_1)-CSDN博客这篇文章之后,我们获取了phase_1的答案字符串,如 图1:phase_1的答案字符串 所示,注意每个人的答案字符串可能都不一样。接…

将程序注册为系统服务

cmd中执行命令: sc create Redis binpath "C:\guet_run1\Redis-x64-5.0.14.1\redis-server.exe" type own start auto displayname "Redis"注意,命令中所有的等号和值之间需要一个空格(等号前不要空格,等号后…

论文怎么改才能降低重复率

一、引言:智能工具助力,轻松降低论文重复率 论文的重复率是学术写作中的重要问题,如何有效降低重复率成为了许多研究者的关注焦点。如今,智能工具的发展为我们提供了更多选择。本文将介绍几种实用的智能工具,包括快码…

(附源码)基于ssm校园体育设施管理系统小程序-计算机毕设 70715

ssm校园体育设施管理系统小程序 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园体育设施管理系统小程…

zookeeper2==zookeeper源码阅读,集群如何选举出LEADER

上一篇已经搭建好了环境,这篇研究下集群是怎么进行选举的。 源码分析: 首先将三台机器的data目录下除了myid之外的都清掉,从零开始启动。 先启动ZK1 然后顺着main阅读源码 org.apache.zookeeper.server.quorum.QuorumPeer#start org.apac…

智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝗虫算法4.实验参数设定5.算法结果6.参考文献7.MA…

这七款网工在线画拓扑工具,绝了!

你们好,我的网工朋友。 画拓扑图,绝对是网络工程师的基操。 上次给你来了篇手把手教你绘制拓扑图的好文,还没看过的先去看啊:《网络拓扑图怎么画最好?》。 关于画拓扑的工具,那就多了,直接用…

深入理解强化学习——马尔可夫决策过程:预测与控制

分类目录&#xff1a;《深入理解强化学习》总目录 预测&#xff08;Prediction&#xff09;和控制&#xff08;Control&#xff09;是马尔可夫决策过程里面的核心问题。预测&#xff08;评估一个给定的策略&#xff09;的输入是马尔可夫决策过程 < S , A , R , P , γ > …

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠

文章目录 简介通过gnome-tweaks设置通过更改登录配置文件logind.conf设置参考资料 简介 学习工作中需要用到笔记本安装Ubuntu Linux系统&#xff0c;并且需要关盖电脑不关机、不挂起且不睡眠。为此&#xff0c;本篇博客整理了两种常规操作方式&#xff0c;并给了详细的步骤&am…