【知识总结】数据库的事务、并发与锁管理

news/2025/10/13 21:26:23/文章来源:https://www.cnblogs.com/zhaoguan_wang/p/19139431

【知识总结】数据库的事务、并发与锁管理

Posted on 2025-10-13 21:22  江城2211  阅读(0)  评论(0)    收藏  举报

事务的四大属性(ACID)

  •  Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。
  •  Consistency(一致性):在事务开始前、进行中、结束后,数据库的完整性没有被破坏。数据库的完整性(实体、参照、自定义)要求,包括唯一约束、外键约束、非空约束、有效值区间等自定义约束不会被破坏。
  •  Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。在事务执行的过程中,无论发生任何数据的改变都应该只存在于当前事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
  •  Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

其实事务主要是为了实现 C ,也就是一致性,具体是通过AID,即原子性、隔离性和持久性来达到一致性的目的。笼统的来说,undo支撑A-原子性、redo支撑D-持久性、锁支撑I-隔离性。

 

事务的隔离级别:

image

事务的隔离级别,本质上是数据库对共享锁的处理(加不加锁、锁定时间及锁定范围),分别对应不加锁、读完即释放、读完直至事务结束后释放、读取范围锁直至事务结束后释放。

 

 

不同隔离级别下的问题描述:

image

 上图为read-uncommited隔离级别,存在读到未提交数据的问题。

image

 上图为read-commited隔离级别,存在不可重复读的问题。

image

上图为repeatable-read隔离级别,存在幻读的问题。

 

多版本并发控制MVCC(全称 Multi-Version Concurrency Control,即多版本并发控制)

简单来说,在MVCC机制还没有出现之前,数据库中读写是互斥的,而通过MVCC机制使得读写不互斥。

因此MVCC使关系型数据库并发读写能力得到很大的提高,而大多数OLTP系统中的85%以上是读操作。

image

 

image

 

锁管理

共享锁(S)

排他锁(X)

更新锁

表级锁、页级锁

架构锁

范围锁

意向共享锁、意向排他锁

 

 

丢失修改(Lost to modify)

指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

 

乐观锁与悲观锁

解决丢失修改的方案一般有两种,即悲观锁与乐观锁,核心思想是假定并发操作产生冲突的概率(发生概率很大或不允许存在冲突,就选择悲观锁,否则可以选择乐观锁)。

悲观锁的实现方式:1、数据库层面的排他锁(select ....for update)或数据锁(字段状态标志); 2、编程语言层面的synchronized或Redis等中间件;

乐观锁的实现方式:1、给数据增加version或时间戳等版本字段,修改时检查版本是否跟读取时一致;

分布式锁本质上是一种数据锁,属于悲观锁的范畴,应用于对数据一致性要求非常高的场景,不允许任何并发冲突。

 

"锁等待"和"死锁"的区别

 1. "死锁"是锁等待形成回路,发生死锁马上会被innodb引擎检测出来,并且回滚其中的一个事务; 而"锁等待“需要其中一个事务等待超过innodb_lock_wait_timeout值才会回滚

2. ”锁等待“超时抛出的错误:Lock wait timeout exceeded; try restarting transaction;而”死锁“抛出的错误是:Deadlock found when trying to get lock; try restarting transaction

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

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

相关文章

实用指南:C语言速成秘籍——循环结构(while、do while、for)和跳转语句(break,continue)

实用指南:C语言速成秘籍——循环结构(while、do while、for)和跳转语句(break,continue)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

描述https的加密过程

链接过程:整体:建立链接时:公钥 + 私钥 => 非对称加密 后续数据传输: mastersecret 对称加密 为什么安全:每一步劫持,都只能截取mastersecret,没法解密,只能透传,转发。有效保护通信数据挣钱养家

CSP-S 2025 提高级模拟赛 Day6 复盘 A.选择方案

题面 给出 \(n\) 个数 \(a_i\),求出 \(a_i+a_j\geq s\) 的 \(i,j\) 总数。 赛时想法 从前往后考虑所有在 \(i\) 之前的,大于 \(s-i\) 的数,\(i\) 可以与这些数配对。自然而然就想到用pbds里的平衡树维护。 预估复杂…

“不要通过共享内存来通信”——深入理解Golang并发模型与CSP理论

“不要通过共享内存来通信”——深入理解Golang并发模型与CSP理论Golang 在设计上另辟蹊径,其并发哲学的核心信条是:“不要通过共享内存来通信,而要通过通信来共享内存。” (Do not communicate by sharing memory;…

SSL证书批量申请终极指南:一次搞定所有域名

免费好用的SSL证书选lcjmSSL,多域名、泛域名都能办,自动流程超省心,安全防护马上有!您的网站必须安装SSL证书? 数据加密,保护隐私:这是最核心的作用。防止用户敏感信息在传输过程中被窃取或篡改。 身份认证,防…

详细介绍:百度C++实习生面试题深度解析(下篇)

详细介绍:百度C++实习生面试题深度解析(下篇)2025-10-13 21:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

npm install creat-vue命令使用报错解决方法

IDEA使用 npm install creat-vue命令的时候出现以下报错! image 可以使用npm init vue@latest就可以解决问题

ARM(IMX6ULL)——通信(IIC/I2C) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PDF转图片工具:基于PyQt5的完整实现与深度解析 - 详解

PDF转图片工具:基于PyQt5的完整实现与深度解析 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

MongoDB安装及使用

安装参考教程: https://dblab.xmu.edu.cn/blog/3980/ 作业要求: 在电脑中完成MongoDB的安装,并通过MongoDB Shell新建一个以自己名字(英文全拼,例如Sunjing)的数据库,并创建一个名为“grade”的集合, 在该集合中…

从Gemini Robotics看通用机器人的科技路径

从Gemini Robotics看通用机器人的科技路径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

张量的基本操作

从现在开始学习李沐的动手学习深度学习 学习深度学习这个科目,我们必须从基础概念开始学习 对于一个机器学习来说,关键的组件如下:可以学习的数据 如何转换数据的模型 一个目标函数, 用来量化模型的有效性 调整模型…

Windows7 隐藏用户

前言 当你在使用电脑时,真的确信只有你一个人在使用吗?会不会在某些不注意的角落,早已经有黑客悄悄潜入,创建了一个你不知道的用户? 漏洞实现 启动管理员cmd,并创建一个test\(用户,并将其分给administrators组。…

10 月记录

CF2159 CF2152 http://192.168.102.138/JudgeOnline/contest.php?cid=2310 http://192.168.102.138/JudgeOnline/contest.php?cid=2312 http://192.168.102.138/JudgeOnline/contest.php?cid=2314 https://htoj.com…

统计学习方法学习Day01

学习了统计学习方法的第一章 1.5正则化与交叉验证 (1)正则化的目的是模型选择的一个经典方法,正则化的是要使风险最小化的策略。正则化实在经验风险上加上一个正则化项,正则化项主要是防止模型在训练过程中出现过拟…

gpt-5-codex vs gpt-5

非常好的问题——你这张截图展示的是一个模型选择界面,列出了两组模型:gpt-5-codex 系列 和 gpt-5 系列,每组又细分成 low / medium / high 等不同等级(有的还有 minimal)。下面是它们的对比与推荐使用场景分析:…

Jenkins Share Library开发入门(一)

写在前面 今日心情有点小丧,但总体问题不大,有一些突然来的活,还没整完,明天再继续搞把。 有难度吗? 有一些把,我觉得还是要做一些自己不擅长的工作,才会有成长的吧,为什么? 用我们测试同学的话术,就是提升“…

第十三篇

今天是10月13号,今天是满课,上午学习了栈的相关知识,下午学习了Java。

网络安全基础--第五课:跨站脚本攻击XSS - 实践

网络安全基础--第五课:跨站脚本攻击XSS - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

成员内部类

成员内部类在类的内部定义,与实例变量,实例方法同级别的类外部类的一个实例部分,创建内部类对象时必须依赖外部类对象Outer out = new Outer(); Inner in = out.new Inner();//外部类 public class Outer {//实例变…