当前位置: 首页 > news >正文

浅浅总结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;

如果其中有任何语句没有执行成功的话,整个事务就会回滚,然后就可以很好的处理上面问题,但是有很多的时候,还有一些其他的问题。

隔离级别

上面提到了事务的四种特性,那么也有一个比较重要的就是隔离级别。在隔离级别中有四种,先基本总结一下这些知识。

  1. 读未提交(Read Uncommitted):在这个隔离级别下,一个事务可以读取到其他事务尚未提交的数据,这意味着一个事务可以读取到其他事务正在修改的数据,可能会导致脏读(Dirty Read)问题。读未提交是最低的隔离级别,它提供了最高的并发性能,但是牺牲了数据的一致性和完整性。

  2. 读已提交(Read Committed):在这个隔离级别下,一个事务只能读取到其他事务已经提交的数据,这样可以避免脏读问题。但是可能会导致不可重复读(Non-Repeatable Read)问题,因为在同一个事务中,多次读取同一数据可能会得到不同的结果,这是因为其他事务可能在两次读取之间提交了修改。

  3. 可重复读(Repeatable Read):在这个隔离级别下,一个事务在执行期间可以多次读取同一数据,而不会受到其他事务的影响。这样可以避免不可重复读问题,但是可能会导致幻读(Phantom Read)问题,因为在同一个事务中,多次读取同一范围的数据可能会得到不同的结果,这是因为其他事务可能在两次读取之间插入了新的数据。

  4. 串行化(Serializable):在这个隔离级别下,事务之间是完全隔离的,一个事务的执行不会受到其他事务的影响,这样可以避免脏读、不可重复读和幻读等所有并发问题。但是串行化隔离级别也是最严格的,可能会导致并发性能下降,因为它要求事务按照严格的顺序执行,无法并行处理。

小结

只是简单的总结了一下事务的一些基础特性,对于数据库的使用,了解这些知识是必不可少的,但是底层的原理肯定不是只有如此的简单,在后面会讲一下mvcc的一些重要知识点,还有WAL的底层,还有就是数据库为什么有了redo log还需要有一个bin log。这些知识都是很重要的,在后面会慢慢总结。

相关文章:

浅浅总结SQL中的事务.

在现实生活中有很多的线上支付的场景,当支付的时候,一方资金减少,另一方资金增加,在执行前后,两者的总体数额需要相同,为了保证这个操作的完整,所以提出了事务,那我们先来去写一个示例&#xff…...

C++ | Leetcode C++题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; 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?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…...

HTTP/1.0、HTTP/1.1、HTTP/2.0区别

文章目录 区别HTTP/1.0HTTP/1.11. 持久连接&#xff08;长连接&#xff09;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 发送请求&#xff0c;随后该请求将会被 Ribbon 所…...

Lua 协程模拟 Golang 的 go defer 编程模式

封装go函数用于创建并启动一个协程&#xff1a; ---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开发中&#xff0c;配置Maven环境有几个重要的原因&#xff1a; 依赖管理&#xff1a;Maven 是一个强大的依赖管理工具&#xff0c;它能够帮助开发人员轻松地管理项目所需的各种第三方库和组件。通过在项目的 Maven 配置文件&#xff08;pom.xml&#xff09;中定义依赖&…...

springCloud服务降级使用到的组件

服务降级在Spring Cloud中通常使用的组件包括断路器&#xff08;Circuit Breaker&#xff09;和降级处理器&#xff08;Fallback&#xff09;。以下是它们的概念表述&#xff1a; 断路器&#xff08;Circuit Breaker&#xff09;&#xff1a;断路器是一种设计模式&#xff0c;…...

Spring框架学习-详细

文章目录 1. Spring简介1.1 面向接口编程1.2 Spring简介1.3 Spring体系结构 2 Spring IoC - 基于XML2.1 Sping框架部署&#xff08;IoC&#xff09;2.2 Spring IoC使用2.3 IoC和DI2.4 DI依赖注入Spring容器通过反射方法实现属性注入有三种方式1. set方法注入2. 构造器注入 2.5 …...

fatal: fetch-pack: invalid index-pack output

解决方案&#xff1a;git clone --depth1 要克隆的git地址 下载最近一次提交的代码 其他分支的内容都不下载 这样整体下载体量就变小了 执行命令&#xff1a;git clone --depth 1 https://gitlab.scm321.com/ufx/xxxx.git...

相机购买指南

佳能1000D 上市时间&#xff1a;2008年6月 简介&#xff1a; 佳能1000D具有1010万有效像素和7点宽区域自动对焦系统。DIGIC III影像处理器的应用使高ISO画质得到提升。小巧的机身和优质的成像质量可以满足初级用户对旅游便携与高画质的要求。使用了DIGIC III影像处理器&#x…...

STM32微秒级别延时--F407--TIM1

基本配置&#xff1a; TIM1挂载在APB2总线上&#xff0c;150MHz经过15分频&#xff0c;得到10MHz计数频率&#xff0c;由于disable了自动重装载&#xff0c;所以只需要看下一次计数值是多少即可。 void TIM1_Delay_us(uint16_t us) //使用阻塞方式进行延时&#xff0c;ARR值不…...

AI图书推荐:杀手级ChatGPT提示词——利用人工智能实现成功与盈利

《杀手级ChatGPT提示词——利用人工智能实现成功与盈利》&#xff08;Killer ChatGPT Prompts_ Harness the Power of AI for Success and Profit &#xff09;一书是作者Guy Hart-Davis关于ChatGPT的指南&#xff0c;ChatGPT是OpenAI开发的大语言模型。这本书提供了各种职业角…...

AI时代:低代码与人工智能引领科技创造新时代

随着科技的飞速发展&#xff0c;我们步入了一个崭新的时代——AI时代。在这个时代&#xff0c;低代码和人工智能技术如日中天&#xff0c;成为引领科技创造的新引擎。本文将围绕这一主题&#xff0c;探讨低代码和人工智能如何在各个领域发挥巨大作用&#xff0c;推动科技创造迈…...

1.基于python的单细胞数据预处理-降维可视化

目录 降维的背景PCAt-sneUMAP检查质量控制中的指标 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 降维的背景 虽然特征选择已经减少了维数&#xff0c;但为了可视化&#xff0…...

【快捷部署】023_HBase(2.3.6)

&#x1f4e3;【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意&#xff1a;本脚本非全自动化脚本&#xff0c;有2次人工干预&#xff0c;第一次是确认内网IP&#xff0c;如正确直接回车即可&#…...

Nginx配置项详解

Nginx&#xff0c;以其高性能、稳定性强、资源消耗低的特性&#xff0c;成为众多网站和应用首选的Web服务器及反向代理服务器。其配置文件的灵活性和丰富性是其强大功能的关键所在。本文将深入解析Nginx配置文件中的核心概念与关键配置项&#xff0c;帮助您更好地理解和定制Ngi…...

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件&#xff0c;其中一个功能是base64和图片的转换。因为分成四个小功能&#xff0c;所以使用的iview的tabs来展示不同功能&#xff0c…...

R2S+ZeroTier+Trilium

软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件&#xff1a;友善 Nanopo R2S软路由系统&#xff1a;OpenWrt&#xff0c;使用第三方固件nanopi-openwrt。内网穿透&#xff1a;ZeroTier。远程笔记&…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...