数据库的事务

news2024/12/30 3:57:03

作者:~小明学编程  

文章专栏:MySQL

格言:目之所及皆为回忆,心之所想皆为过往

在这里插入图片描述

目录

什么是事务?

事务的特性

原子性

一致性

持久性

独立性

事务之间的影响

脏读

不可重复读

幻读

数据库的隔离级别

读未提交

读已提交

可重复读

可序列化


什么是事务?

数据库中的事务指的是逻辑上的一组数据库的操作要么全部都执行要么都不执行

例如:我们现在要进行一个转账的操作张三要转100元到李四的账户上面去,首先要执行第一条的操作就是先去张三的账户上面-100,然后再在李四的账户上面+100,这两个操作一起称作一条事务,但是在张三账户-100元之后,发生了某些故障导致李四的账户上面没有加上100,这时候我们撤销-100的那条指令,这就是所谓的全部都执行要么全部都不执行。

事务的特性

事务有四大特性,分别是原子性,一致性,持久性,隔离性。

原子性

原子性意味着我们的事务是执行过程中的最小的个体,是不能再被拆分的,一个事务不可能存在只执行了一半的这种情况,要么都执行要么就都不执行

一致性

我们事务在执行完之后必须要确保从一个正确的状态转移到另外一个正确的状态,例如我们用微信支付的时候一件商品100元而我们微信里面只有10元,不可能说是我们支付完之后还剩-90元,这是不正确的状态。

持久性

持久性的意思是我们一个事务提交以后对数据库中数据的的改变是持久的,接下来的其它操作或故障不应该对其执行结果有任何影响。

独立性

并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

事务之间的影响

脏读

例如我们在进行多人在线编辑的时候,刚开始在输入年龄的时候不小心在20后面多加了一个0就是200,然后这个200就被人读到了,然后我们发现了错误又把200改成了20,这个时候那个人又发现你把刚刚的200怎么变成了20,这就是脏读,因为我们还没有提交,文档里面的数据可变我们读到的只是一个过程数据。

当事务 T1 正在访问字段 A 并且对进行了修改,而这种修改还没有提交到数据库中。这时另外一个事务 T2 也访问和使用字段 A,但由于事务 T1 修改字段 A 后还没有提交 COMMIT,而那么事务 T2 读到的字段 A 是脏数据。

我们想要解决这个问题的话就在我们写的过程加上锁,这样就不会读到脏数据了。

不可重复读

前面说到我们在写的时候如果去度的话就会读到脏数据,现在我们写的时候不去读了,而是在我们读的时候去写,比如说我们现在有100元,然后有人一定盯着剩余的钱看着,我们买一杯10元的奶茶还剩90,他现在知道我们还剩90,然后做个记录,还剩90,这时候我们又去买了个20的汉堡还剩70,这是那个人打算拿你那个90加上自己的100元190刚好可以买条裤子,但是他再去读的时候发现就剩70了和刚刚读的不一样了。

 不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的。

解决办法就是我们在读的时候给加上锁,读a的时候a不能再改变了。

幻读

前面说到我们在读的时候不能对读的那个事务进行写了,那么现在还有一个问题,既然不能对当前的事务去写我们可以对其它的事务进行写呀。

 在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录, 就好像发生了幻觉一样。

要想解决幻读的问题就只能串行的处理事务。

数据库的隔离级别

针对以上的问题我们数据库专门指定相应的隔离来避免这些问题的产生:

共享锁(S锁):假设事务T1对数据A加上共享锁,那么事务T2可以读数据A,不能修改数据A。

排他锁(X锁):假假设事务T1对数据A加上共享锁,那么事务T2不能读数据A,不能修改数据A。

读未提交

Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。

会产生脏读,不可重复读和幻读问题。

读已提交

Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。

我们在写的时候不能读,但是读的时候可以写,可以解决脏读的问题。

可重复读

Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。

我们在读一个事务的时候不能写,写的时候也不能读,可以解决脏读和不可重复读的问题。

可序列化

Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。

可以解决脏读,不可重复读,幻读的问题。

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

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

相关文章

kvm介绍

kvm里主要去介绍它的虚拟化技术,包括云计算的组成和云计算的背景。 kvm的运行原理,虚拟机的创建,虚拟机的生命周期管理。 云计算的定义 它不是一种技术,它是一种收费模式,就是通过互联网把一些主机的硬件&#xff0…

2021年我国企业服务市场投融资概况 技术服务单笔规模最大 早期融资笔数最多

一、企业服务投融资年度概况 据相关数据显示,2021年我国企业服务市场共发生2417笔投融资事件,其中,1753笔项目已披露融资金额。从月度分布来看,3月、6月、7月、8月和12月的融资数量均在200起以上,其中,12月…

[附源码]Python计算机毕业设计高校学生体温管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Python实现:高斯滤波 均值滤波 中值滤波 Canny(边缘检测)PCA主成分分析 直方图规定化 Mean_Shift

Python实现:高斯滤波 均值滤波 中值滤波 Canny(边缘检测)PCA主成分分析 直方图规定化 Mean_Shift(文末附上整合这些函数的可视化界面并且已做打包处理) 1.高斯滤波(以下函数所有的图片路径为方便前来copy的同学&#…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.4 实现进程缓存

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.4 实现进程缓存46.4.1 实现进程缓存46 JVM 进程缓存 46.4 实现进程缓存 46.4.1 实…

Linux从入门到进阶学习(Ⅱ):Linux基础命令

目录 1 Linux目录结构 2 命令格式 3 目录切换命令 3.1 ls命令 3.2 选项与参数 3.3 目录切换 1.cd 2.pwd 4 路径 5 创建目录命令 6 文件操作命令 6.1 创建文件 6.2 查看文件 6.3 复制文件 6.4 移动文件 6.5 删除文件 1.rm命令 2.通配符 3.root用户 7 查找命…

C语言期末集训2(大一,超基础,小猫猫大课堂的配套练习)——分支结构

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发, 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我…

分库分表 15 连问,你抗的住吗?

我们去面试的时候,几乎都会被问到分库分表。 在这里整理了分库分表的15道经典面试题,大家看完肯定会有帮助的。 1. 我们为什么需要分库分表 在分库分表之前,就需要考虑为什么需要拆分。我们做一件事,肯定是有充分理由的。所以得…

技术分享-应用列表性能优化

阅读文章大约需要10分钟 目录 1.背景 2.分析 3.优化 4.成果 背景 应用存在大量的列表和图片资源加载,如首页、喵圈、直播间广播、礼物面板等, 这些列表的性能对应用性能有着不少的影响。 分析 分析-列表架构VLayout 分析-RecycleView缓存机制 分析-RecycleVi…

【记录】Ubuntu实现逻辑卷的删除

由于我的电脑上有机械硬盘和固态硬盘,所以在之前安装的Centos7系统中,定义了逻辑卷,希望将机械硬盘和固态硬盘在逻辑上当作是统一的整体,但是正因为此操作,导致在重装系统过程中,始终无法对逻辑卷进行分区&…

m基于改进PSO粒子群优化的RBF神经网络解耦控制算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 智能控制的思想最早来自傅京孙教授[,他通过人机控制器和机器人方面的研究,首先把人工智能的自觉推理方法用于学习控制系统,将智能控制概括为自动控制和人工智能…

MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的,但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容,所以需要另外想办法编程获取,比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32…

Spring官宣新家族成员:Spring Authorization Server

8月17日,Spring官方宣布 Spring Authorization Server 已正式脱离实验状态,并进入Spring-Project家族! 背景 Spring Authorization Server (以下简称 SAS)是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目&…

【react】生命周期

组件从创建到死亡会经历一些特定的阶段 React组件中包含一系列勾子函数(生命周期回调函数)会在特定的时候调用 我们 在定义组件时,会在特定的生命周期回调函数中做特定的工作 一、旧版本的生命周期 1、初始化阶段 constructor()componentWil…

CVE-2022-22965:spring参数绑定漏洞

CVE-2022-22965 博客链接:https://www.blog.23day.site/articles/73 漏洞说明 Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告&#xff…

LabVIEW创建自定义书签管理器

LabVIEW创建自定义书签管理器 书签是一种特殊的标记机制,可以添加到VI框图中。任何以井号标签(#)开头的文本都将被LabVIEW自动识别为书签。这些可用于标记代码不同部分中的待办事项或未完成的任务。当您将主题标签添加框图注释时&#xff0c…

基于java的贪吃蛇游戏-计算机毕业设计

项目介绍 本游戏采用Java环境和Eclipse开发工具,开发了一个界面美观,操作简单并且功能齐全的贪食蛇游戏,整个游戏分为了10个类,实现了游戏的开始、结束、暂停,通过了本游戏的开发,达到了学习Java及Java GU…

使用新路由器有线/无线桥接旧路由器

问题描述 已有一个无线路由器,但信号不能满足需求,遂购买新路由器对其进行桥接。经过在网上搜索和实践,成功配置,将经验记录成帖。 解决方案 无线桥接 1. 打开新路由器设置界面。(根据路由器说明说或者网上搜索对应…

新手学python,如何才能更快升职加薪,迎娶白富美,走上人生巅峰

最近在问答里发现好多咨询怎么学习python,或者学习难不难的问题,这里给大家提几点建议: 了解自己的目标 我开始学编程的时候,连基础的知识都不知道,小白的很!记得我开始看教材,就是输入“hello…

Vue系列之使用vue init搭建前端项目

文章の目录一、执行 vue init webpack my-project 注意(my-project)是自己的项目名写在最后前提执行如下代码 npm install -g vue/cli-init一、执行 vue init webpack my-project 注意(my-project)是自己的项目名 回车既可&…