浅浅总结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。远程笔记&…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...