数据库———事务及bug的解决

news2024/9/20 14:34:47

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你!

目录

一:事务

1:场景引入

2:“回滚”

3:恢复机制(undo log,redo log)

4:事务的特点

二:并发执行事务及Bug详解

1:场景引入

Bug(1):“脏读”问题

①场景引入

②解决思路(给“写”上锁)

Bug(2):不可重复读

①场景引入(沿用Bug1的场景)

②解决思路(给“读”上锁)

Bug(3):幻读

①场景引入(沿用Bug2的场景)

②解决思路()

三:隔离级别

1:read uncommitted(读未提交)

2:read committed(读已提交)

3:repeatable read (可重复读)

4:serializable(串行化)

四:实际运用(简述)


一:事务

1:场景引入

张三在银行账户中存有1000元,李四存有500元,这时张三要给李四支付500元,执行sql语句

①:update account set balance = balance -500 where name = '张三';

②:update account set balance = balance + 500 where name = '李四';

想象一下,如果在sql语句①执行完之后,数据库挂了,那不仅张三被扣了钱,李四还没有收到钱,问题就麻烦了

2:“回滚”

此时就引入了事务这一概念,“要么条sql语句都不执行,要么都执行”。

注:这里的不执行其实还是执行了的,“回滚”(rollback),恢复回去,这里涉及到数据库的一种恢复机制(undo log , redo log)

3:恢复机制(undo log,redo log)

读法:(安度  老哥  , 瑞都 老哥)哈哈

恢复机制会在数据库运行的时候,把你的操作写成日志的形式(println)保存到文件中,当数据库挂了之后,重启数据库,数据库会检查日志中是否有只执行了一半或者没有执行完的操作,如果有,就会把之前的操作进行回滚

优缺点:事务保证了数据的准确性,但是牺牲了执行效率

4:事务的特点

(1)原子性:事务的出现,本质就是将“操作”进行打包(这是事务的核心特性)

(2)一致性:是原子性的延伸,当数据库出现问题的时候,避免出现像上述钱不翼而飞的情况,即要么都执行,要么都不执行,另一方面我们也会添加一些约束条件,来避免数据出现一些非法的情况

(3)持久性:事务的操作是被写入硬盘的(持久保存的),电源关机,重启程序,这些修改的额操作都不会消失,(数据库本身就是为了持久化存储而生的)

(4)可隔离性:当多个事务并发操作时,可能会带来一些情况,我们可以通过隔离性来进行权衡,偏向数据的准确性多一点,或者偏向执行效率

二:并发执行事务及Bug详解

1:场景引入

数据库是cs结构的,一个数据库会面向多个服务器,当多个服务器同时向数据库发出事务请求,这就叫做并发执行事务。如果多个服务器请求的是修改不同的表那还好,如果是修改相同的表的话就会出现一些Bug

Bug(1):“脏读”问题

①场景引入

服务器A:对数据库发出事务请求,修改了某个数据(写),但是还没有“提交”(提交的意思就是,告诉数据库,我的操作OK了,结束了)

服务器B:同时对数据库进行读取,读取了这个数据,但是这个数据并不一定是准确的,因为A后续还可能对数据进行修改,所以B的这一次读取操作就是“脏读”

通俗解释:考试中张三在写卷子,我过去瞄了一眼他写的答案,但是张三后面又修改成了正确答案,导致我抄的答案其实是错误的

②解决思路(给“写”上锁)

给操作“上锁”,在A对数据库操作的时候,(上锁),其它服务器不能访问,等到A的操作完成之后(解锁),后面的服务器才可以进行操作(看)

注意:这里的上锁是针对(写操作)服务器A

通俗解释:就是去上厕所,一个坑只能一个人上,坑里的人开门出来了,你才能进去

Bug(2):不可重复读

①场景引入(沿用Bug1的场景)

服务器A在访问(写)数据库时候上锁了,服务器B在A结束操作之后开始第一次读取,此时进来一个服务器C(写)访问服务器,修改了数据,服务器B第二次读取数据发现:嘿怎么两次读取的数据不一致???

注:上锁是针对,服务器在数据库(写)修改数据的情况,没说你在读的时候,我不能修改呀!!

②解决思路(给“读”上锁)

在服务器“读”的时候也进行上锁。

不难发现Bug(2)和Bug(1)很像,就是(1)的一个延伸。

Bug(3):幻读

①场景引入(沿用Bug2的场景)

服务器A上锁修改数据库数据,解锁后,服务器B开始第一次上锁读取,此时服务器C不修改数据了,C新增了一个数据,B第二次读取发现“结果集”发生了变化,王德发??

解释“结果集”:就是类似表的行数

②解决思路()

把并行事务串口化,不再进行任何并行开发,使用串口开发,一项事务执行完毕后,再继续下一项(实际开发中并行,串行视情况而定)

三:隔离级别

上述的的三种bug要根据实际开发情况来判定到底是否为bug,有的场景更注重与效率,有的场景更注重数据的准确性

1:read uncommitted(读未提交)

并行程度(高),隔离级别(低),效率(高),数据的准确性(低),可能会触发:“脏读”,“不可重复读”,“幻读”

2:read committed(读已提交)

并行程度(中),隔离级别(中),效率(中),数据的准确性(中),可能会触发:“不可重复读”,“幻读”

3:repeatable read (可重复读)

并行程度(低),隔离级别(高),效率(低),数据准确性(高),可能会触发:“幻读”

4:serializable(串行化)

并行程度(无了),隔离级别(最高),效率(最低),数据准确性(最准)

四:实际运用(简述)

1:start transaction(执行事务)

2:sql1,sql2,sql3语句进行打包

3:commit(告诉服务器,事务执行完毕)

4:roolback(告诉服务器,要进行回滚即开启事务后,执行的sql语句恢复回去)

roolback一般不会在控制台中执行,一般是在java代码中实现,先在代码中开启事务,控制执行sql语句(打包提交),结果某条sql语句报错,catch捕获异常,并且使用rollback(回滚)

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

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

相关文章

全网最全comfyui工作流保姆级教程来啦!comfyui工作流搭建看这一篇就够了

前言 一、SD主流 UI Stable Diffusion(SD)因为其开源特性,有着较高的受欢迎程度,并且基于SD的开源社区及教程、插件等,都是所有工具里最多的。基于SD,有不同的操作界面,可以理解为一个工具的不…

vue node node-sass sass-loader 版本 对应 与 兼容

警告: LibSass 和 Node Sass 已弃用。虽然它们将继续无限期地接收维护版本,但没有计划添加其他功能或与任何新的 CSS 或 Sass 功能兼容。仍在使用它的项目应该转移到 Dart Sass。 sass Sass是一种预处理器脚本语言,可以解释或编译成…

【rust】rust条件编译

在c语言中,条件编译是一个非常好用的功能,那么rust中如何实现条件编译呢? rust的条件编译需要两个部分,一个是fratures,另一个是cfg。Cargo feature是一个非常强大的功能,可以提供条件编译和可选依赖项的高级特性&…

如何让大模型更好地进行场景落地?

自ChatGPT模型问世后,在全球范围内掀起了AI新浪潮。 有很多企业和高校也随之开源了一些效果优异的大模型,例如:Qwen系列模型、MiniCPM序列模型、Yi系列模型、ChatGLM系列模型、Llama系列模型、Baichuan系列模型、Deepseek系列模型、Moss模型…

OJ 组合总和

题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制…

en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 分散

因为还没写聚集并且材质没有设置摩擦系数,所以出现了这种刚体受力得到初速度却无法减少,从而乱飞的情况 本教程部分代码师承于siki学院siki老师的人工智能编程这一案例,我认为自己的水平有限,老师的写法太过高级,所以就…

Kubernetes从零到精通(11-CNI网络插件)

Kubernetes网络模型 Kubernetes的网络模型(Kubernetes Networking Model)旨在提供跨所有节点、Pod和服务的统一网络连接。它的核心理念是通过统一的网络通信规则,保证集群中的所有组件能够顺畅地相互通信。Kubernetes网络模型主要有以下几个关…

【html网页制作】传统文化书法主题网页制作html+css(6页面附效果源码)

HTMLCSS传统文化主题书法网页制作 🍔涉及知识🥤写在前面🍧一、网页主题🌳二、网页效果菜单切换效果PageA、整体页Page1、主页Page2、行书页Page3、楷书页Page4、隶书页Page5、篆书页Page6、草书页 🐋三、网页架构与技术…

启动cadence过程中出现cdn_sfl401as.dll缺失问题解决办法_不需要重装软件

有时候,由于OrCAD安装了多了版本或其他原因,原本用的好好地CAD突然无法使用,一般是因为你安装的新软件或者其他操作与原来的CAD环境冲突,出现了cdn_sfl401as.dll等多个dll文件缺失现象,提示需要重装环境。 重装环境&a…

11 vue3之插槽全家桶

插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot></slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…

electron多标签页模式更像客户端

Electron多标签页模式是指在Electron框架中实现的类似Web浏览器的多标签页功能。Electron是一个使用Web技术&#xff08;HTML、CSS和JavaScript&#xff09;来创建跨平台桌面应用程序的框架。在Electron中实现多标签页模式&#xff0c;通常需要借助一些特定的库或组件&#xff…

qt-creator-10.0.2之后版本的jom.exe构建和编译速度慢下来了

1、Qt的IDE一直在升级&#xff0c;qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本&#xff0c;官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…

Elastic 的 OpenTelemetry PHP 发行版简介

作者&#xff1a;Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

“悟空”带火古建游,KPaaS 为酒旅行业打造长效流量

8月20日&#xff0c;首款国产3A游戏&#xff08;高质量、高体量、高成本的单机游戏&#xff09;《黑神话&#xff1a;悟空》正式推出&#xff0c;游戏发售近一个月&#xff0c;热度不但没有减退&#xff0c;反而在中秋假期迎来了一个小高潮。据国外数据分析公司 VG Insights 的…

稀土长余辉发光剂在陶瓷上应用场景有哪些?

基于稀土离子独特的4f电子层结构,具有多种电子跃迁形式&#xff0c;因此其光学特性丰富。将其掺杂于不同类型的晶体基质中&#xff0c;得到稀土长余辉材料,即可实现长余辉发光效果,发光时间可长达6-10小时。 稀土长余辉发光材料在陶瓷上的应用主要利用了其在激发后能够持续发光…

雷朋太阳镜和AEG的制胜法宝是:音乐节以及数据驱动的品牌推广

图片来源&#xff1a;Photo by Ethan Robertson on Unsplash 几十年来&#xff0c;我们见证了流行文化偶像对大众的影响。雷朋一直是一个深受偶像和大众喜爱的品牌。借助这股浪潮&#xff0c;雷朋与全球最大的娱乐公司之一AEG合作&#xff0c;吸引消费者&#xff0c;并以沉浸式…

力扣题解2332

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;​&#xff1a; 坐上公交的最晚时间 给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一…

(计算机毕设)基于SpringBoot+Vue的“乐锄”农产品销售网站的设计与实现

毕业设计&#xff08;论文&#xff09; 博主可接毕设&#xff01;&#xff01;&#xff01; 基于SpringBootVue的“乐锄”农产品销售网站的设计与实现 摘 要 传统的农资采购销售模式&#xff0c;造成农业生产的效率和质量低&#xff0c;人们对食品安全问题关注不断增加&#x…

WhaleStudio 与飞腾 S5000C 处理器完成产品兼容测试!

中秋佳节后喜讯传来&#xff01;经过飞腾信息技术有限公司和北京白鲸开源科技有限公司的联合严格测试&#xff0c;白鲸开源 WhaleStudio 套件 V2.6 版本已在飞腾信息技术有限公司的腾云 S5000C 处理器平台上成功安装并稳定运行。 这标志着白鲸开源商业与飞腾的合作进入了一个新…

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略&#xff1a;扩展 Fixed (固定): 行为&#xff1a;控件的大小是固定的&#xff0c;不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景&#xff1a;当你希望控件的大小保持不变&#xff0c;不随布局调整时使用&#x…