数据库事务
什么是事务
在数据库中,事务(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…...
Next.js API路由的正确使用姿势
在使用Next.js开发应用时,API路由的配置和使用是非常重要的一部分。尤其是当我们从客户端组件中请求API时,如果不正确配置,可能会遇到一些常见的错误,比如404错误。本文将通过实例详细解释如何在Next.js中正确配置和使用API路由。 问题背景 假设你正在使用Next.js 14.2.3…...
OpenClaw开源贡献指南:Qwen3.5-9B技能模块PR提交流程
OpenClaw开源贡献指南:Qwen3.5-9B技能模块PR提交流程 1. 为什么需要你的贡献 去年冬天,当我第一次尝试用OpenClaw自动整理电脑上的照片时,发现现有的技能库缺少一个"智能相册整理"模块。那一刻我突然意识到:这个开源项…...
AI Agent开发实战系列 - LangGraph(8): 利用add_conditional_edges构建智能决策工作流
1. 理解LangGraph中的条件决策机制 在AI Agent开发中,动态决策能力是区分普通流程和智能系统的关键。LangGraph提供的add_conditional_edges方法就像给工作流装上了"智能导航系统"——我最近在客服工单系统中实践时发现,传统硬编码的分流规则需…...
nli-distilroberta-base实际项目:新闻摘要与原文蕴含关系自动评估
nli-distilroberta-base实际项目:新闻摘要与原文蕴含关系自动评估 1. 项目概述 在新闻媒体和内容创作领域,如何快速评估一篇摘要是否准确反映了原文内容一直是个挑战。传统的人工审核方式效率低下且成本高昂。nli-distilroberta-base项目正是为解决这一…...
TCA9548A I²C多路复用器原理与嵌入式实战指南
1. TCA9548A IC多路复用器技术解析与嵌入式系统集成实践 1.1 器件定位与工程价值 TCA9548A是德州仪器(TI)推出的低电压8通道IC总线开关,其核心价值在于解决嵌入式系统中IC总线地址冲突这一经典工程难题。在STM32、ESP32、Raspberry Pi等主流…...
OpenClaw对话式编程:Qwen3-4B模型解释代码与生成示例
OpenClaw对话式编程:Qwen3-4B模型解释代码与生成示例 1. 为什么需要对话式编程? 作为一名长期与代码打交道的开发者,我经常遇到这样的困境:面对一段复杂代码时,需要反复查阅文档;学习新框架时,…...
如祺出行2025年营收53亿:网约车贡献97%收入 净亏2.9亿
雷递网 乐天 4月1日如祺出行科技有限公司(股份代号:9680)日前发布截至2025年12月31日的财报。财报显示,如祺出行2025年营收为52.86亿元,较上年同期的24.63亿元增长114.6%。如祺出行收入主要来自网约车服务,…...
别再死记硬背MVC了!通过Unity连连看实战,我搞懂了数据与UI分离的5个真实好处
从连连看实战看数据与UI分离的五大工程化收益 在游戏开发领域,设计模式常常被视为"高级概念"而被初学者敬而远之。但当我真正在Unity中实现一个简单的连连看游戏时,才深刻体会到MVC模式中数据与UI分离带来的实际价值。这不是教科书上的理论说教…...
FinalBurn Neo技术指南:现代设备复刻街机厅沉浸体验全攻略
FinalBurn Neo技术指南:现代设备复刻街机厅沉浸体验全攻略 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 如何在现代设备上复刻街机厅的沉浸体验?FinalBurn Neo(FBN…...
雷小兔:让学术论文排版变得简单高效
产品概述 雷小兔是一款专门为学生和研究人员设计的学术论文辅助工具。无论你是在准备毕业论文、学位论文还是学术发表,雷小兔都能为你提供全面的支持和帮助。 论文排版方面的核心优势 1. 模板齐全,开箱即用 雷小兔内置了数十种符合国内外高校标准的论…...
