诚意满满之讲透事务

news2025/2/24 23:17:53

诚意满满系列每一篇都是精挑细选,从大众知识点到原理再到具体实现,争取把一个知识点从头到尾完整讲下来,足以应付面试与工作。让读者读完之后能够有一种:“这个知识我看这一篇就够了”的感觉是本系列最大愿望。

对于本人而言,在之前的学习中也发现,八股文讲得细致但不系统,而系统的学习往往又宽泛不细致,所以也打算取长补短,互相结合一下,欢迎大家收藏关注,持续更新。

事务

事务的常见定义:

事务是一种用于管理数据库操作的机制,它可以确保数据库的一组操作要么全部成功执行,要么全部回滚到初始状态,保证数据的一致性和完整性

换个角度来说,事务相当于将多个操作合并成一个操作,这个操作只有成功和失败两种结果,没有中间状态,就跟cpu指令一样,一个指令要么不执行,要么完全执行。当然,这么说是理想状态(懂得都懂),实际上不同的事务隔离级别会有不同效果,后文会详细讲到。

事务的四个特性:

  1. 原子性(Atomicity):事务中的所有操作要么都成功完成,要么都失败回滚。即事务是不可分割的,要么全部执行,要么全部不执行,不会出现部分执行的情况。

  2. 一致性(Consistency):事务的执行不会破坏数据库的一致性约束。在事务开始前和结束后,数据库的状态必须满足一定的一致性规则。

  3. 隔离性(Isolation):同一时间多个并发事务的执行互不干扰,每个事务都认为它是唯一正在执行的事务。事务的隔离性可以防止并发执行事务时出现脏读、不可重复读和幻读的问题。

  4. 持久性(Durability):一旦事务提交,其所做的修改将被永久保存在数据库中,即使系统发生故障,重新启动后也能够恢复到事务提交后的一致状态。持久性确保事务的结果是可靠的,不会因为系统故障而丢失。

原子性和持久性很好理解,隔离性会放到事务隔离级别里面会更好理解一点,暂不赘述。

单独讲讲一致性

一致性有点抽象,一致性的意思是说,嗯。。。,事务的执行不会破坏数据库的一致性约束。

咳,重点在这两句话的加粗字体:

1、事务的执行不会破坏数据库的一致性约束

2、在事务开始前和结束后,数据库的状态必须满足一定的一致性规则

拿耳熟能详的交易例子来说,假设在交易系统里只有两个人A和B,两个人的余额总额200块,无论两个人如何交易,最后两个人的余额加起来一定是=200。那么,这个“所有余额相加=200”就是一个一致性约束。

这时候*大的举手了:这个看起来是应用层的设定,好像和数据库没有关系?

没错,你可以理解一致性就是:应用系统从一个正确的状态到另一个正确的状态.而ACID就是说事务能够通过AID来保证这个C的过程.C是目的,AID都是手段

用《数据密集型系统分析与设计》中的一句话来说:

"ensuring the consistency is the responsibility of user, not DBMS."(保证一致性是用户的责任,而非数据库)

一个应用的一致性约束是什么,取决于具体的业务(像交易系统的总额不变),这个是由用户决定的,而不是数据库。数据库承担的作用是,它按照用户给定的事务去正常执行、提交或回滚后,不会破坏这个一致性约束。

前提是用户给的代码没有bug。如果在一次交易中,用户分成两个事务提交:买的提交一次,卖的提交一次,一旦在买和卖中间宕机,最后的总额对不上是板上钉钉的事。

因此,保证一致性是用户的责任,而非DBMS。

开胃菜先简短一点,后面还有

  • 事务的隔离级别以及不同隔离级别面临的问题
  • mysql如何实现事务隔离

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

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

相关文章

Unity UGUI之InputField(TMP)基本了解

Unity的InputField组件是用于在Unity中创建可供用户输入文本的输入框的UI组件。通过InputField组件,可以让用户在运行时输入文本,比如用户名、密码、搜索关键字等。其中TMP版本的InputField是基于TextMeshPro的InputField组件,提供了更多的文…

数字建筑欢乐颂,智慧工地共筑美好未来!

在解决农民工人欠薪这一长期困扰建筑业的难题上,某建筑公司响应政策,严格按照实名制管理,实施过程中发现并克服了传统管理模式的痛点:聊天群组的信息时,往往会被淹没在“收到”回复中,影响沟通效率&#xf…

win10阿里云实现内网穿透#frp

win10&阿里云实现内网穿透#frp 文章目录 win10&阿里云实现内网穿透#frp一、什么是内网穿透?下载frp 二、云服务端部署frps三、本地部署frpc 一、什么是内网穿透? 内网穿透是一种网络技术,它允许外部网络用户通过互联网访问局域网&am…

【力扣白嫖日记】1193.每月交易I

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1193.每月交易I 表:Transactions 列名类型idintcountryvarcharstateenumamountinttrans_datedat…

MongoDB 可调节的一致性,其他数据库都不行系列 (白皮书 翻译)--1

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…

初识C语言—初识C语言

前言 C语言全面了解,全貌认识 细致的学习,细枝末节 什么是C语言 维基百科 C 语言是一种通用的高级语言,最初是由丹尼斯里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 …

探索机器学习的无限可能性:从初学者到专家的旅程

探索机器学习的无限可能性:从初学者到专家的旅程 在当今数字时代,机器学习无疑是最引人注目的技术之一。它已经深入到我们生活的方方面面,从个性化推荐到自动驾驶汽车,再到医疗诊断和金融预测。但是,即使我们已经见证…

《Ubuntu20.04环境下的ROS进阶学习2》

一、使用rviz和gazebo实时仿真 本节我们将使用三维可视化工具rviz(The Robot Visualization Tool)来实时观测gazebo仿真中的激光雷达数据。 二、打开仿真gazebo项目 如果您已经按照 《Ubuntu20.04环境下的ROS进阶学习0》-CSDN博客 如果您已经按照上次的文…

Java中常用的集合及方法(3)

1、List(接上级--常用方法示例补充) 1.4 常用的方法 1.4.2 LinkedList(JDK8) LinkedList是Java中一个实现了List接口和Deque接口的类,它采用链表结构存储数据,支持高效的插入和删除操作。 LinkedList中…

【工具】Git的24种常用命令

相关链接 传送门&#xff1a;>>>【工具】Git的介绍与安装<< 1.Git配置邮箱和用户 第一次使用Git软件&#xff0c;需要告诉Git软件你的名称和邮箱&#xff0c;否则无法将文件纳入到版本库中进行版本管理。 原因&#xff1a;多人协作时&#xff0c;不同的用户可…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

ARM-v7 程序计数器PC的相关指令与应用

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

从 iPhone 设备恢复误删微信消息的 4 种方法

您的微信消息可能会因无意删除、系统崩溃、卸载微信应用或升级过程失败而被删除。如果您遇到这种情况&#xff0c;您不必担心&#xff0c;因为您可以采取某些步骤来恢复丢失的微信历史记录。这里有 4 种方法可以帮助您从 iPhone恢复丢失的微信消息、群聊历史记录或微信联系人。…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【脚本玩漆黑的魅影】全自动刷努力值

文章目录 原理全部代码 原理 全自动练级&#xff0c;只不过把回城治疗改成吃红苹果。 吃一个可以打十下&#xff0c;背包留10个基本就练满了。 吃完会自动停止。 if img.getpixel(data_attack[0]) data_attack[1] or img.getpixel(data_attack_2[0]) data_attack_2[1]: # …

Solidity Uniswap V2 价格预言机

预言机是连接区块链与链下服务的桥梁&#xff0c;这样就可以从智能合约中查询现实世界的数据。Chainlink 是最大的oracle网络之一&#xff0c;创建于 2017 年&#xff0c;如今已成为许多 DeFi 应用的重要组成部分。https://github.com/XuHugo/solidityproject Uniswap 虽然是链…

matlab双目相机标定-需要什么参数、怎么获得

相机标定目的&#xff1a;获得相机内参、外参、畸变系数&#xff0c;摄像头的内参(f,1/dx,1/dy,cx,cy)、畸变参数(k1,k2,k3,p1,p1)和外参(R,t)&#xff0c;用于接下来的双目校正和深度图生成从而实现二维到三维的转换。 相机标定方法&#xff1a;opencv 双目相机标定以及立体…

Objects类 --java学习笔记

Objects类 Objects是一个工具类&#xff0c;提供了很多操作对象的静态方法给我们使用 Objects类常用的三个方法 Objects.equals 比直接equals更安全&#xff0c;因为Objects.equals里面做了非空校验 Objects.isNull&#xff08;A&#xff09; 等价于 A null Objects.non…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Springboot+vue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的医院药品管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…