数据库事务到底是什么?

news2024/12/23 17:21:55

目录

场景(两个用户之间进行转账操作):

 需要的操作步骤:

事务

事务的四大特性:

一、原子性

(1)什么是回滚操作

 (2)数据库恢复操作,如何知道数据恢复如初?(如何知道数据回滚正确)

 二、一致性

 三、持久性 

 四、隔离性(重点)

1. 脏读

 解决脏读:

2. 不可重复读

 解决不可重复读:

3. 幻读

 解决幻读:

总结并发处理事务的三个典型问题:

MySQL内置的机制(对应上述几种隔离级别)


前言

    数据库事务的相关知识也是面试常考的问题,这篇文章介绍为什么要有事务以及事务的概念,事务的特性,以及数据库基于隔离性(特性)产生并发执行所引出的问题,如何解决这个问题。

场景(两个用户之间进行转账操作):

    用户A要给用户B进行转账,就要操作数据库中的数据表;如下图:

 需要的操作步骤:

(1)update acccount set balance = balance - 500 where id = 1;

(2)update account set balance = balance + 500 where id = 2;

     假设在执行转账的过程中,执行完sql语句(1)之后,数据库崩溃了/主机宕机了,此时用户1的钱扣了,但是2的钱没到账。

    那针对这样的问题数据库该如何解决?

事务

    事务就是为了解决上述问题,事务的本质就是把多个sql语句给打包成一个整体,要么全部执行成功,要么就一个都不执行,而不会出现 ”执行一半“ 这样的中间状态。(这就是事务出现的初心)

事务的四大特性:

1. 原子性(回滚)上述 ”一点都补执行“ 不是真正的没有执行,而是在中间状态进行了 ”回滚“ 操作
2. 一致性

数据进行修改之后,要和之前的数据能够对应上。

3. 持久性数据持久保存
4.隔离性(重点介绍)这个特性是为了解决事务 ”并发执行“ 引起的问题

一、原子性

    原子性是数据库设计事务的初心,这点要清楚,上述场景出现后,事务就是为了解决这个问题,

事务的本质就是把多个要执行的sql语句打包成一个整体,使事务变成要执行的一个基本单位,不能再分。(要么就不执行这个事务,要么就一次执行完事务)

(1)什么是回滚操作

    当一个事务执行到一半时,此时数据库崩溃了,数据库在下一次启动时就要把未执行完的数据恢复到之前的状态,这个恢复数据的操作,称为 ”回滚“。

  注:上述 ”事务要么一点都不执行“,不是真正的没有执行,而是说看起来好像没有执行一样,事务执行一半,数据库崩溃,数据库再次启动后,此时选择恢复数据,就是把未执行完的数据还原成了未执行之前的状态了。

 (2)数据库恢复操作,如何知道数据恢复如初?(如何知道数据回滚正确)

    数据库中有专门记录事务的日志,用日志来记录事务的操作步骤。日志就是写到磁盘上的文件,断电之后,日志也不会消失,所以数据库重新启动后,就把数据进行正确的恢复。

    注:正因如此,使用事务后,执行sql语句的开销也就更大了,效率也更低了。

 二、一致性

         执行sql语句前后的数据要能够保证正确性。

    数据执行的前后,数据时靠谱的,也就是能够和正确的操作数据能够对应上,如:用户1给用户2转账500,此时2的账户上就多了500,不能多出来5000,50000。

    没有引入事务的时候,这个 特性就是要必须保证的,有了事务之后,这个特性也不能丢失。

 三、持久性 

    事务修改的内容是写到硬盘上的,持久存在的,数据库重启之后,也能保证数据没有丢失。

    还是转账这个场景,此时如果数据库崩溃之后,所有的用户的余额都是保存在数据库中的,此时不能说数据库崩了,用户的钱也跟着一起没了,这是不靠谱的,所以说数据库中的数据是持久保存的。

 四、隔离性重点

    解决事务 “ 并发”执行引起的问题。

    注:数据库是客户端服务器这样的一个结构,数据库也是服务器;就有可能出现多个客户端同时提交给数据库多个事务,此时数据库就需要并发处理多个事务。

    如果是修改的同一张表中的同一个数据,此时就有可能出现问题,如:多个客户尝试对同一个账户进行转账操作,就有可能把这个数据搞乱。

    并发执行事务可能产生的问题:

(1)脏读问题
(2)不可重复读问题
(3)幻读问题

1. 脏读

    一个事务 正在对数据进行修改的过程中,还没有提交数据之前,另外一个事务B也对同一个数据进行读取,此时B的读数据操作称为 “脏读”,读到的数据也是称为 “脏数据”,(脏的意思是无效,就是读到的数据是无效的数据)

 解决脏读:

    mysql引入“给写操作加锁” 的机制   

(多线程中同步锁问题,详解可以看这篇文章:锁策略和 cas 优化过程_良月初十♧的博客  )

加锁之后写操作和读操作就不能并发执行了(不能同时进行),给写操作加锁,就降低了并发的程度(也降低了效率),提高了隔离性(提高了数据的准确性)。

2. 不可重复读

    事务1已经提交了数据,此时事务2开始去读数据,在读的过程中,事务3又提交了新的数据,此时意味着同一个事务2之内,多次读数据读出来的结果是不一样的(预期是一个事务中,多次读取的结果是一样的),此时就称为 “不可重复读”。

 解决不可重复读:

    给读操作也进行加锁,通过给读加锁,又进一步降低了事务的并发处理能力(处理效率也降低),提高事务的隔离性(数据的准确性又提高了)。

3. 幻读

    在给读和写数据加锁的前提下,一个事务两次读取同一个数据,发现读取的数据内容是一样的,但是结果集不一样,此时称为 “幻读”。

 解决幻读:

    数据库使用串行化的方式来解决幻读,彻底放弃并发执行,一个接着一个的串行的处理事务,此时并发程度是最低的(效率是最慢的),隔离性是最高的(数据的准确性也是最高的)。、

总结并发处理事务的三个典型问题:

1. 脏读问题给读加锁
2. 不可重复读问题给写加锁
3. 幻读彻底执行串行化

MySQL内置的机制(对应上述几种隔离级别)

1. read uncommitted没有进行任何话锁限制并发最高(效率最高),隔离性最低(数据的准确性最低)
2. read committed给写加锁了,并发程度 降低,隔离性提高了(数据准确性提高)

3. repeatable read

给写和读都进行加锁,并发程度进一步降低,隔离性进一步提高
4. serializable串行化,并发程度最低,隔离性最高

    可以通过修改MySQL的配置文件来设置当前MySQL是工作在哪种情况下。

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

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

相关文章

C++ Stack&queue&deque

C Stack&queue&deque 📟作者主页:慢热的陕西人 🌴专栏链接:C 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容主要讲解了栈和…

如何在华为OD机试中获得满分?Java实现【字符串通配符】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

Rust 笔记:Rust 语言中应用正则表达式

Rust 笔记 Rust 语言中应用正则表达式 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器(Once Only Controller)参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器(Once Only Controller)参数说明 可以让控制器内部的逻辑只执行一次;单次的范围是针对某…

Spring Authorization Server 系列(一)环境搭建

Spring Authorization Server 中的scope参数解析 前提依赖版本问题确定Spring Boot 版本确定 Spring Authorization Server 版本最终的依赖 第一个 Spring Authorization Server Demo 前提 由于 Spring 最新的 OAuth2 解决方案 已经由 Spring Security 下的 OAuth2 模块独立出…

从零开始学习JavaScript:轻松掌握编程语言的核心技能①

从零开始学习JavaScript:轻松掌握编程语言的核心技能 一,JavaScript 简介为什么学习 JavaScript?JavaScript 用法 二,JavaScript 输出JavaScript 显示数据JavaScript:直接写入 HTML 输出流 三,JavaScript 语法JavaScr…

VS2022发布独立部署的.net程序

.net core支持依赖框架部署和独立部署两种方式,之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例,VS2022中默认编译的是依赖框架部署方式(编译的结果如下图所示)…

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略 内容概要 本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里: Android进阶 View事件体系(一):概要介绍和实…

Oracle——数据操纵DML(一)

STU1 1、不指定字段的整行插入 在STU1中新增一名同学的基本信息,SQL如下: INSERT INTO test.stu1 VALUES(0001,牛牛,男,24,to_date(1988-05-25,YYYY-MM-DD),12外语)格式如下: INSERT INTO 表名 VALUES(值1,值2,...,值n)对于CHAR或VARCHAR等…

sql-labs SQL注入平台——第二关Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入) 一、先确认漏洞是否存在 (1)查询 id1返回查询结果正常 (2)查询 id1’返回查询结果报错,可能存在SQL注入 (3)查询 id1 …

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码 文章目录 路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用…

Dubbo环境搭建

1.搭建zookeeper注册中心环境 zookeeper下载地址 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ptMw7rb-1685261782669)(b894c0cbb6501ca97145d3b09685ae8f.png)] 在bin文件下,启动zkServer.cmd会有报错,处理需要在condi…

你所不知道的 数据在内存中储存 的来龙去脉

那么好了好了,宝子们,今天给大家介绍一下 “数据在内存中储存” 的来龙去脉,来吧,开始整活!⛳️ 一、数据类型的介绍 (1)整型和浮点型: (2)其他类型…

Linux——使用命令行参数管理环境变量

目录 使用命令行参数获取用户在DOS命令行输入的指令: 方法:代码如下: 使用命令行参数获取并打印部分或者整体环境变量的方法: 方法1: 运行结果: 方法2:使用外部链接environ: 使用命令行参数…

如何开发背包系统?

UE5 插件开发指南 前言0 背包数据结构1 背包管理组件2 背包UI显示前言 相信大家对于背包系统并不陌生,谁还没有玩过几款游戏呢?游戏中的背包都是大同小异的,朴素的功能就是存放我们获取到的物品,高级一点就是要有物品分类,便于玩家刷选背包中的物品,能够显示玩家拥有的货…

2023 牛津大学博士后申请指南

牛津大学是全球著名的高等教育机构,其博士后项目备受瞩目。为了帮助申请者更好地了解牛津大学博士后申请流程,本文将介绍该校博士后申请指南的相关内容。一、申请条件首先,申请者必须已经获得博士学位或即将完成博士学位,并具有相…

《数据库应用系统实践》------ 报刊销售系统

系列文章 《数据库应用系统实践》------ 报刊销售系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&#xff…

k8s 对已完成job自动清理

job在处理完一个任务以后,状态会变成Completed,job在状态为Completed的时候默认不会自动清理的,还会继续占用系统资源。 TTL-after-finished控制器 kubernetes中有专门的控制器可以自动清理已完成的job,就是TTL-after-finished控制器。 TTL…

数据中心产业如何变革?中国数字能源生态大会这些观点值得一读

对于数据中心产业,这是一个最好的时代。数字经济的蓬勃发展,推动产业数字化、企业数字化转型步入纵深阶段,大幅增加数据中心等基础设施的需求,让数据中心产业迎来前所未有的市场良机。 与此同时,对于数据中心产业&…