数据库事务
什么是事务
在数据库中,事务(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…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
