数据库事务
什么是事务
在数据库中,事务(Transaction)是指一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,是保证数据库操作一致性的基本单位。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个特性。
事务的特性
原子性(Atomicity)
原子性是指事务中的所有操作要么全部成功完成,要么全部回滚到事务开始前的状态。即事务中的所有操作要么全部执行,要么全部不执行,不会出现执行了一半的情况。
一致性(Consistency)
一致性是指事务执行前后,数据库的完整性约束没有被破坏。在事务开始和结束时,数据库的完整性约束都得到保持,比如外键约束、唯一性约束等。
隔离性(Isolation)
隔离性是指多个事务并发执行时,彼此之间是相互隔离的,一个事务的执行不应该受到其他事务的干扰。即使多个事务同时访问同一个数据,也不能相互影响,每个事务感觉自己独立地操作数据。为了保证隔离性,数据库系统采用了多种隔离级别,如下文所述。
持久性(Durability)
持久性是指事务一旦提交成功,对数据库的修改就是永久性的,不会因为数据库崩溃或其他原因导致数据丢失。即使系统发生故障,也能够保证数据不会丢失。
隔离级别
隔离级别是指多个事务并发执行时,一个事务对数据的修改对其他事务的可见程度。常见的隔离级别有四种,分别是读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。
读未提交(Read uncommitted)
读未提交是最低的隔离级别,一个事务可以读取其他事务未提交的数据,可能会导致脏读(Dirty read)问题,即读到了其他事务已经修改但未提交的数据。
读已提交(Read committed)
读已提交是指一个事务只能读取已经提交的其他事务的数据,可以避免脏读问题。但是由于其他事务正在执行,所以可能出现不可重复读(Non-repeatable read)问题,即同一个事务内读取同一数据两次,结果不一致。
可重复读(Repeatable read)
可重复读是指同一个事务内多次读取同一数据时,结果是一致的,即使其他事务修改了该数据,也不会对该事务造成影响。可重复读可以避免不可重复读问题,但是可能会出现幻读(Phantom read)问题,即同一个事务内两次查询,结果不一致,因为其他事务在此期间插入了符合条件的数据。
串行化(Serializable)
串行化是最高的隔离级别,强制所有事务串行执行,避免了脏读、不可重复读和幻读等问题。但是由于强制串行执行,导致并发性能非常差,一般不推荐使用。
为什么要使用事务
使用事务的主要目的是保证数据库中的数据一致性和完整性。在现实生活中,许多业务场景都需要保证多个操作作为一个整体进行,而不是单独执行,这时候就需要使用事务来保证这些操作的原子性,也就是要么全部执行成功,要么全部失败,保证数据的一致性。
举个例子,假设我们要从银行账户A向账户B转账100元。这个过程需要进行两个操作:将账户A的余额减去100元,将账户B的余额增加100元。如果没有事务保证,当这两个操作分别执行时,如果在这两个操作之间发生了系统崩溃、网络中断等异常情况,就有可能导致A账户扣款成功但B账户未收到款项,从而导致数据的不一致性。使用事务可以保证这两个操作作为一个整体进行,如果在操作过程中出现异常,可以回滚事务,保证数据的完整性。
此外,使用事务还可以避免多个客户端并发修改同一个数据造成的数据冲突问题,比如脏读、不可重复读、幻读等。通过设置不同的隔离级别,可以平衡并发性能和数据一致性之间的关系。
因此,使用事务可以有效保证数据库中数据的一致性和完整性,同时避免多个客户端并发修改同一个数据造成的数据冲突问题。
案例演示:
展示如何使用事务来保证一组 SQL 操作的原子性。
假设我们有两个表,一个是用户表 user,一个是订单表 order,其中订单表记录了每个用户的订单信息。现在我们要实现一个功能,当用户下单时,需要先将用户的余额扣减相应的金额,然后再在订单表中插入一条订单记录。
首先,我们创建表:
CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
);CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,amount DECIMAL(10, 2) NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
接下来,我们可以使用以下的 SQL 语句来实现这个功能:
START TRANSACTION; -- 开始事务UPDATE user SET balance = balance - 100.00 WHERE id = 1; -- 扣减用户余额INSERT INTO order (user_id, amount) VALUES (1, 100.00); -- 插入订单记录COMMIT; -- 提交事务
在上面的代码中,我们首先使用 START TRANSACTION
开始一个事务,然后执行扣减用户余额的操作和插入订单记录的操作,最后使用 COMMIT
提交事务。如果在执行这些操作的过程中发生了任何错误,我们可以使用 ROLLBACK
回滚事务,保证数据的完整性和一致性。
需要注意的是,如果使用 InnoDB 引擎,MySQL 默认的隔离级别是 REPEATABLE READ
。这种隔离级别可以避免脏读、不可重复读、幻读等问题,但是也可能导致性能问题。如果需要平衡并发性能和数据一致性,可以考虑使用更低的隔离级别,比如 READ COMMITTED
或 READ UNCOMMITTED
。
相关文章:
数据库事务
什么是事务 在数据库中,事务(Transaction)是指一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,是保证数据库操作一致性的基本单位。事务具有原子性(Atomicity)、一致性…...

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境
1.打开 Terminal 终端(Command空格,输入Terminal)。 1.1 输入如下指令,查看是否显示版本信息。 clang --version 1.2 如果出现版本信息,则跳过,否则输入 xcode-select --install 2. 为 VS Code 安装插件 …...
如何使用 Matlab 构建深度学习模型
深度学习已经成为了AI领域的热门话题,相信很多人都想学习如何构建深度学习模型,那么,我们就一起来看看如何使用Matlab构建深度学习模型。 首先,我们需要准备好Matlab的环境。Matlab是一款非常强大的数学计算软件,它提…...

PDF怎么转CAD文件?(免费!高效转换方法汇总)
一般而言,PDF图纸是不能修改的。若需修改,则需将PDF转CAD,此时如何满足PDF转CAD的需求呢?今天,我将教你两种免费的PDF转CAD的方法,助力高效办公。 1.本地软件转换法 这是用本地软件转换方法,支…...
经历了野蛮生长之后,新科技或许已经抵达了全新的临界点
跳出仅仅只是以概念和营销的方式来定义元宇宙,真正找到元宇宙与现实商业之间的桥接,让元宇宙可以在真实实践上得到复现,才是保证元宇宙的发展可以进入到一个全新发展阶段的关键所在。归根到底,我们还是要找到元宇宙落地的正确的方…...

Segment Anything论文翻译,SAM模型,SAM论文,SAM论文翻译;一个用于图像分割的新任务、模型和数据集;SA-1B数据集
【论文翻译】- Segment Anything / Model / SAM论文 论文链接: https://arxiv.org/pdf/2304.02643.pdfhttps://ai.facebook.com/research/publications/segment-anything/ 代码连接:https://github.com/facebookresearch/segment-anything 论文翻译&…...

EMQX vs NanoMQ | 2023 MQTT Broker 对比
引言 EMQX 和 NanoMQ 都是由全球领先的开源物联网数据基础设施软件供应商 EMQ 开发的开源 MQTT Broker。 EMQX 是一个高度可扩展的大规模分布式 MQTT Broker,能够将百万级的物联网设备连接到云端。NanoMQ 则是专为物联网边缘场景设计的轻量级 Broker。 本文中我们…...

RabbitMQ实现消息的延迟推送或延迟发送
一、RabbitMQ是什么? 1.RabbitMQ简介 RabbitMQ是有erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。 常见的消息队列有:RabbitMQ、Kafka 和 ActiveMQ 2.RabbitMQ的优点 Rab…...

解决python中import导入自己的包呈现灰色 无效的问题
打开File–> Setting—> 打开 Console下的Python Console,把选项(Add source roots to PYTHONPAT)点击勾选上。 右键点击需要导入的工作空间文件夹,找到Mark Directory as 选择Source Root。 另外,Python中的…...
消息中间件对比
1,常见消息中间件对比(后续逐个介绍) 比较项TubeMQKafkaPulsar数据时延非常低,10ms比较低,250ms非常低,10msTPS高,14W/s一般,10W/s高,14W/s (高性能场景)过滤消费支持服务端过滤和客户端过滤客…...

nodejs+vue 高校校园食堂餐品在线订购网
食堂作为学校的一个重要的部门,为学生提供了用餐的地点,学生可以在食堂享用丰富的餐品,建立一个在校订餐网站,帮助了学生提供一个用餐订餐的系统,也帮助了食堂提供了一个餐品展示的站点。 园的食堂作为一个窗口单位&a…...

SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行
SpringBoot【运维实用篇】---- SpringBoot程序的打包与运行 程序打包程序运行SpringBoot程序打包失败处理命令行启动常见问题及解决方案 刚开始做开发学习的小伙伴可能在有一个知识上面有错误的认知,我们天天写程序是在Idea下写的,运行也是在Idea下运行的…...
10万字智慧政务数据中心平台建设方案
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 一、 项目建设内容 1. 基础支撑平台 基础支撑平台是云教育公共服务平台各子系统的公共运行环境,提供底层数据交换、集成服务以及统一身份认证和基础数据同步服…...
使用 TensorFlow 构建机器学习项目:1~5
原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象&#x…...
【store商城项目08】删除用户的收获地址
1.删除收获地址-持久层 1.1规划SQL语句 根据aid判断数据是否存在,根据返回的uid判断数据是否对应(已开发)根据aid删除的SQL delete from t_address where aid ?根据1中的SQL返回的对象判断是否为默认地址,若为默认地址&#…...

SpringBooot
目录 一、简介 1、使用原因 2、JavaConfig (1)Configuration注解 (2)Bean注解 (3)ImportResource注解 (4)PropertyResource注解 (5)案例 3、简介 4…...
测牛学堂:2023软件测试linux和shell脚本入门系列(shell的运算符)
shell中的注释 以# 开头的就是shell中的注释,不会被执行,是给编程的人看的。 shell中的运算符 shell中有很多运算符。 按照分类,可以分为算术运算符,关系运算符,布尔运算符,字符串运算符,文件…...
TensorFlow 2.0 快速入门指南:第三部分
原文:TensorFlow 2.0 Quick Start Guide 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现…...
webpack介绍
webpack是一个静态资源打包工具 开发时,我们会使用框架(Vue,React),ES6模块化语法,Less/Sass等css预处理器等语法进行开发。 这样的代码想要在浏览器运行必须经过编译成浏览器能识别的JS、CSS等语法&#x…...
SpringBoot 面试题汇总
1、spring-boot-starter-parent 有什么用 ? 我们都知道,新创建一个 SpringBoot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用: 1、 定义了 J…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...