当前位置: 首页 > 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。远程笔记&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…...