浅浅总结SQL中的事务.
在现实生活中有很多的线上支付的场景,当支付的时候,一方资金减少,另一方资金增加,在执行前后,两者的总体数额需要相同,为了保证这个操作的完整,所以提出了事务,那我们先来去写一个示例,做一个简单的引子吧。
在这里,有一个简单的用户表。里面有用户的资金和用户的简单信息。
mysql> CREATE TABLE users (-> user_id INT PRIMARY KEY,-> username VARCHAR(50) UNIQUE,-> balance DECIMAL(10, 2)-> );
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO users (user_id, username, balance) VALUES-> (1, 'user1', 100.00),-> (2, 'user2', 200.00),-> (3, 'user3', 300.00);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
如果没有事务的话,我们会用下面的语句,来去改变这个数据库,但是如果是大型业务的话,可能会有高并发的情况出现,这样的话,因为写数据库的操作是比较慢的,所以可能会导致支付这个场景出现问题。
mysql>
mysql> -- 2
Query OK, 0 rows affected (0.00 sec)mysql> UPDATE users SET balance = balance + 50.00 WHERE user_id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
那么怎么解决呢?就提出了事务的概念,现在先了解一下事务,然后在给出后面的解决方法。
事务的ACID
原子性(atomicity)
原子性是事务的ACID属性之一,指的是事务中的所有操作要么全部执行成功,要么全部执行失败,不存在部分执行的情况。如果事务中的任何一个操作失败,整个事务都会被回滚到之前的状态,以确保数据的一致性和完整性。
原子性保证了数据库在并发环境下的正确性。无论是由于系统错误、数据库故障、硬件故障还是用户错误,原子性都可以确保数据的一致性。如果事务是原子性的,那么数据库将保持在一个一致的状态,这是非常重要的,尤其是在需要对数据库进行修改的情况下。
使用事务来组织多个操作可以确保这些操作要么全部成功,要么全部失败,从而保证了数据的完整性
隔离性(isolation)
隔离性是数据库事务的ACID属性之一,它确保在多个并发事务同时执行时,每个事务都能够独立地操作数据,就好像没有其他事务在同时运行一样。具体来说,隔离性要求一个事务的执行不会被其他并发事务的执行所影响,即使这些并发事务是在同一时间执行的。
在数据库中,隔离性通过事务隔离级别来实现。SQL标准定义了四种事务隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。隔离级别越高,事务之间的隔离程度越高,但同时也可能会导致性能下降和并发性降低。
总的来说,隔离性保证了事务之间的独立性和数据的一致性,避免了并发事务之间的相互干扰和数据不一致的情况。
一致性(consistency)
一致性是数据库事务的ACID属性之一,它确保了数据库从一个一致的状态转移到另一个一致的状态。具体而言,一致性保证了当事务开始之前和事务结束之后,数据库中的数据必须符合所有定义的约束、规则和完整性约束。
在事务中,如果数据操作违反了数据库的完整性约束或规则,那么事务应该回滚到事务开始之前的状态,以保持数据库的一致性。换句话说,一致性确保了事务的执行不会使数据库处于一个不一致或无效的状态。
总的来说,一致性保证了数据库的数据始终处于一个有效且符合规则的状态,无论是在事务开始之前还是事务结束之后。
持久性(durability)
持久性是数据库事务的ACID属性之一,它确保一旦事务被提交,所做的修改将永久保存在数据库中,并且不会因为系统故障、崩溃或断电等原因而丢失。换句话说,持久性保证了事务所做的改变在提交后是永久性的,即使在系统故障的情况下也不会丢失。
数据库系统通过使用日志(transaction log)来实现持久性。在事务进行修改数据库之前,系统会将这些修改记录到事务日志中,然后再将这些修改应用到数据库中。在事务提交之后,系统会确保事务日志中的所有修改已经被成功写入到永久存储介质(例如磁盘)上,这样即使系统发生故障,数据库也可以通过重放事务日志来恢复到故障之前的状态。
持久性是确保数据在数据库系统中的长期存储和可靠性的重要保证。它使得用户可以放心地进行数据操作,不必担心数据丢失或损坏的风险。
了解了上面的问题之后,在后面给出使用事务解决上面问题的方法:
-- 开始事务
START TRANSACTION;-- 扣除用户1的余额
UPDATE users SET balance = balance - 50.00 WHERE user_id = 1;-- 增加用户2的余额
UPDATE users SET balance = balance + 50.00 WHERE user_id = 2;-- 提交事务
COMMIT;
如果其中有任何语句没有执行成功的话,整个事务就会回滚,然后就可以很好的处理上面问题,但是有很多的时候,还有一些其他的问题。
隔离级别
上面提到了事务的四种特性,那么也有一个比较重要的就是隔离级别。在隔离级别中有四种,先基本总结一下这些知识。
-
读未提交(Read Uncommitted):在这个隔离级别下,一个事务可以读取到其他事务尚未提交的数据,这意味着一个事务可以读取到其他事务正在修改的数据,可能会导致脏读(Dirty Read)问题。读未提交是最低的隔离级别,它提供了最高的并发性能,但是牺牲了数据的一致性和完整性。
-
读已提交(Read Committed):在这个隔离级别下,一个事务只能读取到其他事务已经提交的数据,这样可以避免脏读问题。但是可能会导致不可重复读(Non-Repeatable Read)问题,因为在同一个事务中,多次读取同一数据可能会得到不同的结果,这是因为其他事务可能在两次读取之间提交了修改。
-
可重复读(Repeatable Read):在这个隔离级别下,一个事务在执行期间可以多次读取同一数据,而不会受到其他事务的影响。这样可以避免不可重复读问题,但是可能会导致幻读(Phantom Read)问题,因为在同一个事务中,多次读取同一范围的数据可能会得到不同的结果,这是因为其他事务可能在两次读取之间插入了新的数据。
-
串行化(Serializable):在这个隔离级别下,事务之间是完全隔离的,一个事务的执行不会受到其他事务的影响,这样可以避免脏读、不可重复读和幻读等所有并发问题。但是串行化隔离级别也是最严格的,可能会导致并发性能下降,因为它要求事务按照严格的顺序执行,无法并行处理。
小结
只是简单的总结了一下事务的一些基础特性,对于数据库的使用,了解这些知识是必不可少的,但是底层的原理肯定不是只有如此的简单,在后面会讲一下mvcc的一些重要知识点,还有WAL的底层,还有就是数据库为什么有了redo log还需要有一个bin log。这些知识都是很重要的,在后面会慢慢总结。
相关文章:
浅浅总结SQL中的事务.
在现实生活中有很多的线上支付的场景,当支付的时候,一方资金减少,另一方资金增加,在执行前后,两者的总体数额需要相同,为了保证这个操作的完整,所以提出了事务,那我们先来去写一个示例ÿ…...
C++ | Leetcode C++题解之第76题最小覆盖子串
题目: 题解: class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…...
什么可以替代iframe?
网页嵌套中,iframe曾几何时不可一世,没有其他更好的选择! iframe即内联框架,作为网页设计中的一种技术,允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利,但也存在多方面的缺陷…...
HTTP/1.0、HTTP/1.1、HTTP/2.0区别
文章目录 区别HTTP/1.0HTTP/1.11. 持久连接(长连接)2. 管道化3. Host头字段4. 分块传输编码5. 缓存机制6. 请求方法 HTTP/2.01. 二进制分帧2. 多路复用3. 服务器推送4. 优先级设置5. 头信息压缩6. 安全性7. 流量控制 区别 特性HTTP/1.0HTTP/1.1HTTP/2.0…...
鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄
句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…...
2024.5.8 关于 SpringCloud —— Ribbon 的基本认知
目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求,随后该请求将会被 Ribbon 所…...
Lua 协程模拟 Golang 的 go defer 编程模式
封装go函数用于创建并启动一个协程: ---go函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建一个暂停的协程coroutine.resume(co, co) -- 调用coroutine.resume激活…...
maven的安装与配置(超详细)
在Java开发中,配置Maven环境有几个重要的原因: 依赖管理:Maven 是一个强大的依赖管理工具,它能够帮助开发人员轻松地管理项目所需的各种第三方库和组件。通过在项目的 Maven 配置文件(pom.xml)中定义依赖&…...
springCloud服务降级使用到的组件
服务降级在Spring Cloud中通常使用的组件包括断路器(Circuit Breaker)和降级处理器(Fallback)。以下是它们的概念表述: 断路器(Circuit Breaker):断路器是一种设计模式,…...
Spring框架学习-详细
文章目录 1. Spring简介1.1 面向接口编程1.2 Spring简介1.3 Spring体系结构 2 Spring IoC - 基于XML2.1 Sping框架部署(IoC)2.2 Spring IoC使用2.3 IoC和DI2.4 DI依赖注入Spring容器通过反射方法实现属性注入有三种方式1. set方法注入2. 构造器注入 2.5 …...
fatal: fetch-pack: invalid index-pack output
解决方案:git clone --depth1 要克隆的git地址 下载最近一次提交的代码 其他分支的内容都不下载 这样整体下载体量就变小了 执行命令:git clone --depth 1 https://gitlab.scm321.com/ufx/xxxx.git...
相机购买指南
佳能1000D 上市时间:2008年6月 简介: 佳能1000D具有1010万有效像素和7点宽区域自动对焦系统。DIGIC III影像处理器的应用使高ISO画质得到提升。小巧的机身和优质的成像质量可以满足初级用户对旅游便携与高画质的要求。使用了DIGIC III影像处理器&#x…...
STM32微秒级别延时--F407--TIM1
基本配置: TIM1挂载在APB2总线上,150MHz经过15分频,得到10MHz计数频率,由于disable了自动重装载,所以只需要看下一次计数值是多少即可。 void TIM1_Delay_us(uint16_t us) //使用阻塞方式进行延时,ARR值不…...
AI图书推荐:杀手级ChatGPT提示词——利用人工智能实现成功与盈利
《杀手级ChatGPT提示词——利用人工智能实现成功与盈利》(Killer ChatGPT Prompts_ Harness the Power of AI for Success and Profit )一书是作者Guy Hart-Davis关于ChatGPT的指南,ChatGPT是OpenAI开发的大语言模型。这本书提供了各种职业角…...
AI时代:低代码与人工智能引领科技创造新时代
随着科技的飞速发展,我们步入了一个崭新的时代——AI时代。在这个时代,低代码和人工智能技术如日中天,成为引领科技创造的新引擎。本文将围绕这一主题,探讨低代码和人工智能如何在各个领域发挥巨大作用,推动科技创造迈…...
1.基于python的单细胞数据预处理-降维可视化
目录 降维的背景PCAt-sneUMAP检查质量控制中的指标 参考: [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 降维的背景 虽然特征选择已经减少了维数,但为了可视化࿰…...
【快捷部署】023_HBase(2.3.6)
📣【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意:本脚本非全自动化脚本,有2次人工干预,第一次是确认内网IP,如正确直接回车即可&#…...
Nginx配置项详解
Nginx,以其高性能、稳定性强、资源消耗低的特性,成为众多网站和应用首选的Web服务器及反向代理服务器。其配置文件的灵活性和丰富性是其强大功能的关键所在。本文将深入解析Nginx配置文件中的核心概念与关键配置项,帮助您更好地理解和定制Ngi…...
解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题
同学们可以私信我加入学习群! 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件,其中一个功能是base64和图片的转换。因为分成四个小功能,所以使用的iview的tabs来展示不同功能,…...
R2S+ZeroTier+Trilium
软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件:友善 Nanopo R2S软路由系统:OpenWrt,使用第三方固件nanopi-openwrt。内网穿透:ZeroTier。远程笔记&…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
