浅浅总结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。这些知识都是很重要的,在后面会慢慢总结。

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

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

相关文章

springboot Redis 支持星号(*) 包括注解@Cache

通过自定义CacheManager Bean来实现 bean Autowiredprivate RedisConnectionFactory redisConnectionFactory;/*** 管理缓存** return*///缓存管理器PrimaryBeanOverridepublic CacheManager cacheManager() {// 使用自定义的缓存配置初始化一个cacheManagerreturn new Custom…

深度学习笔记001

目录 一、批量规范化 二、残差网络ResNet 三、稠密连接网络(DenseNet) 四、循环神经网络 五、信息论 六、梯度截断 本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记,感兴趣的读者可以去官网http://zh.gluon.a…

中小学校活动向媒体投稿报道宣传有哪些好方法

作为一所中小学校的教师,我肩负着向外界展示学校风采、宣传校园文化活动的重要使命。起初,每当学校举办特色活动或取得教学成果时,我都会满怀热情地撰写新闻稿,希望通过媒体的平台让更多人了解我们的故事。然而,理想丰满,现实骨感,我很快发现,通过电子邮件向媒体投稿的过程充满…

技术速递|Python in Visual Studio Code 2024年4月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展 2024 年 4 月发布! 此版本包括以下公告: 改进了 Flask 和 Django 的调试配置流程Jupyter Run Dependent Cells with Pylance 的模块和导入分析Hatch 环境发…

Vue+OpenLayers7入门到实战:OpenLayers解析通过fetch请求的GeoJson格式数据,并叠加要素文字标注,以行政区划边界为例

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上通过fetch请求geojson数据,然后通过OpenLayers解析为Feature要素叠加到图层上,并且通过动态设置标注方式显示要素属性为文字标注。 本章还是以行政区划边界为例,这个…

网工常用工具——Xshell

今天给各位介绍一下,Xshell工具 Xshell是一款功能强大的终端模拟器,主要用于Windows操作系统,用于远程访问和管理服务器,允许用户通过SSH(Secure Shell)协议安全地连接到远程Linux/Unix服务器或其他支持SS…

Linux的并发与竞争

文章目录 一、并发二、竞争三、保护内容是什么四、解决并发与竞争的几种常用方法1.原子操作原子整型API函数原子位操作 API 函数 2.自旋锁自旋锁格式如下:自旋锁 API 函数自旋锁的使用注意事项 3.信号量信号量 API 函数信号量格式如下: 4.互斥体API函数如…

【LeetCode刷题记录】994. 腐烂的橘子

994 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直…

算法题:动态规划

记忆化搜索&动态规划 面试题 08.14. 布尔运算 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。 …

【第66例】IPD体系进阶:华为IPD发展历程

目录 简介 样例 作者简介 简介 想要引入 IPD,首先就要思考一些问题: 跟我的企业适配吗? 流程会不会太重了? 一定要引入吗,有没有其他方式? 从目前大的环境来说。 中国制造业正在由“中国制造”向“中国创造”转变。 这也是企业价值转移的趋势。 宏碁集团创始人施振…

[C/C++] -- 搜索迷宫路径

DFS(深度优先搜索)和BFS(广度优先搜索)是两种常用的图遍历算法,它们在搜索图或树中的节点时有着不同的策略和特点。 深度优先搜索 (DFS): 在DFS中,从起始节点开始,沿着一条路径尽可能深地搜索&a…

健康知识集锦

页面 页面代码 <% layout(/layouts/default.html, {title: 健康知识管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"box-header"><div class"box-title"&g…

triton之语法学习

一 基本语法 1 torch中tensor的声明 x = torch.tensor([[1,2, 1, 1, 1, 1, 1, 1],[2,2,2,2,2,2,2,2]],device=cuda) 声明的时候有的时候需要指出数据的类型,不然在kernel中数据类型无法匹配 x = torch.tensor([1,2,1,1,1,1,1,1],dtype = torch.int32,device=cuda) 2 idx id…

2024年数据安全软件排行榜:哪款守护神最值得信赖?

在数字化时代&#xff0c;数据安全已成为企业和个人不可或缺的一部分。为了确保数字资产的安全&#xff0c;市场上涌现出了众多数据安全软件。以下是数据安全软件Top 10&#xff0c;它们以卓越的性能和功能&#xff0c;为您的数字世界提供坚实的保障。 一、数据安全系统排排行…

LInux 基础指令

Useradd useradd 命令用于建立用户帐号 useradd 可用来建立用户帐号。帐号建好之后&#xff0c;再用 passwd 设定帐号的密码。而可用 userdel 删除帐号。使用 useradd 指令所建立的帐号&#xff0c;实际上是保存在 /etc/passwd 文本文件中。 参数 -c <备注>  加上备注…

word-快速入门

1、熟悉word界面 2、word排版习惯 3、排版文本基本格式 1、word界面 选项卡 功能组 点击功能组右下角小三角可以开启完整功能组&#xff0c;获得启动器 软件右上角有功能显示折叠按钮 2、排版好习惯 &#xff08;1&#xff09;随时保存 &#xff08;2&#xff09;规范文件命…

替换spring-boot中的组件版本

spring-boot是一个用于简化开发的框架&#xff0c;引入spring-boot后会自动包含spring框架&#xff0c;通过引入xxx-start来完成指定组件的功能。比如&#xff1a; spring-boot-starter-web(嵌入 Tomcat 和 web 开发需要的 servlet 和 jsp 支持)spring-boot-starter-data-jpa(…

AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级

近来&#xff0c;云南镇雄一医院发生持刀伤人事件持续发酵&#xff0c;目前已造成2人死亡21人受伤。此类事件在医院层出不穷&#xff0c;有的是因为医患纠纷、有的是因为打架斗殴。而且在每日大量流动的人口中&#xff0c;一些不法分子也将罪恶的手伸到了医院&#xff0c;实行扒…

使用golang实现k-means

k-means聚类算法 K-Means是一种无监督算法&#xff0c;其目标是将数据进行分类。分类个数要求已知。 k-means流程 随机确定K个点作为质心、找到离每个点最近的质心&#xff0c;将这个点分配到这个质心代表的簇里再对每个簇进行计算&#xff0c;以点簇的均值点作为新的质心如…

LeetCode343:整数拆分

题目描述 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 代码 动态规划 class Solution { public:int integerBreak(int n) {/*dp[i]&#xff1a;表示对…